ZGlmZiAtLWdpdCBhL3BvbS54bWwgYi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ODk3OTcKLS0tIC9kZXYvbnVsbAorKysgYi9wb20ueG1sCkBAIC0wLDAgKzEsMzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKwk8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisJPHBhcmVudD4KKwkJPGdyb3VwSWQ+bmV0LnNmLnRhdmVybmEudDI8L2dyb3VwSWQ+CisJCTxhcnRpZmFjdElkPnVpLWNvbXBvbmVudHM8L2FydGlmYWN0SWQ+CisJCTx2ZXJzaW9uPjAuOTwvdmVyc2lvbj4KKwk8L3BhcmVudD4KKwk8Z3JvdXBJZD5uZXQuc2YudGF2ZXJuYS50Mi51aS1jb21wb25lbnRzPC9ncm91cElkPgorCTxhcnRpZmFjdElkPmNyZWRlbnRpYWwtbWFuYWdlci11aTwvYXJ0aWZhY3RJZD4KKwk8dmVyc2lvbj4wLjEwLVNOQVBTSE9UPC92ZXJzaW9uPgorCTxuYW1lPkNyZWRlbnRpYWwgTWFuYWdlciBVSTwvbmFtZT4KKwk8ZGVzY3JpcHRpb24+CisJCUludGVncmF0ZXMgdGhlIENyZWRlbnRpYWwgTWFuYWdlciBpbnRvIHRoZSBXb3JrYmVuY2gKKwk8L2Rlc2NyaXB0aW9uPgorCTxkZXBlbmRlbmNpZXM+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+bmV0LnNmLnRhdmVybmEudDIudWktYXBpPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+bWVudS1hcGk8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke3QyLnVpLmFwaS52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm5ldC5zZi50YXZlcm5hLnQyLnNlY3VyaXR5PC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Y3JlZGVudGlhbC1tYW5hZ2VyPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+MC42LjI8L3ZlcnNpb24+CisJCTwvZGVwZW5kZW5jeT4KKwk8L2RlcGVuZGVuY2llcz4KKwk8cmVwb3NpdG9yaWVzPgorCQk8cmVwb3NpdG9yeT4KKwkJCTxyZWxlYXNlcyAvPgorCQkJPHNuYXBzaG90cz4KKwkJCQk8ZW5hYmxlZD5mYWxzZTwvZW5hYmxlZD4KKwkJCTwvc25hcHNob3RzPgorCQkJPGlkPm15Z3JpZC1yZXBvc2l0b3J5PC9pZD4KKwkJCTxuYW1lPm15R3JpZCBSZXBvc2l0b3J5PC9uYW1lPgorCQkJPHVybD5odHRwOi8vd3d3Lm15Z3JpZC5vcmcudWsvbWF2ZW4vcmVwb3NpdG9yeTwvdXJsPgorCQk8L3JlcG9zaXRvcnk+CisJPC9yZXBvc2l0b3JpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL25ldC9zZi90YXZlcm5hL3QyL3dvcmtiZW5jaC91aS9jcmVkZW50aWFsbWFuYWdlci9DcmVkZW50aWFsTWFuYWdlclVJLmphdmEgYi9zcmMvbWFpbi9qYXZhL25ldC9zZi90YXZlcm5hL3QyL3dvcmtiZW5jaC91aS9jcmVkZW50aWFsbWFuYWdlci9DcmVkZW50aWFsTWFuYWdlclVJLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhjY2Q4YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvbmV0L3NmL3RhdmVybmEvdDIvd29ya2JlbmNoL3VpL2NyZWRlbnRpYWxtYW5hZ2VyL0NyZWRlbnRpYWxNYW5hZ2VyVUkuamF2YQpAQCAtMCwwICsxLDE1ODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIFVuaXZlcnNpdHkgb2YgTWFuY2hlc3RlciAgIAorICogCisgKiAgTW9kaWZpY2F0aW9ucyB0byB0aGUgaW5pdGlhbCBjb2RlIGJhc2UgYXJlIGNvcHlyaWdodCBvZiB0aGVpcgorICogIHJlc3BlY3RpdmUgYXV0aG9ycywgb3IgdGhlaXIgZW1wbG95ZXJzIGFzIGFwcHJvcHJpYXRlLgorICogCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAgIAorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogICAgCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBuZXQuc2YudGF2ZXJuYS50Mi53b3JrYmVuY2gudWkuY3JlZGVudGlhbG1hbmFnZXI7CisKK2ltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7CisvL2ltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7CisvL2ltcG9ydCBqYXZhLmF3dC5DdXJzb3I7CitpbXBvcnQgamF2YS5hd3QuRGltZW5zaW9uOworaW1wb3J0IGphdmEuYXd0LkZsb3dMYXlvdXQ7CitpbXBvcnQgamF2YS5hd3QuSW1hZ2U7CitpbXBvcnQgamF2YS5hd3QuUG9pbnQ7CitpbXBvcnQgamF2YS5hd3QuVG9vbGtpdDsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5Nb3VzZUFkYXB0ZXI7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VFdmVudDsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dBZGFwdGVyOworaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVGYWN0b3J5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGU7CisKK2ltcG9ydCBuZXQuc2YudGF2ZXJuYS50Mi5zZWN1cml0eS5jcmVkZW50aWFsbWFuYWdlci5DTUV4Y2VwdGlvbjsKK2ltcG9ydCBuZXQuc2YudGF2ZXJuYS50Mi5zZWN1cml0eS5jcmVkZW50aWFsbWFuYWdlci5DTVg1MDlVdGlsOworaW1wb3J0IG5ldC5zZi50YXZlcm5hLnQyLnNlY3VyaXR5LmNyZWRlbnRpYWxtYW5hZ2VyLkNyZWRlbnRpYWxNYW5hZ2VyOworaW1wb3J0IG5ldC5zZi50YXZlcm5hLnQyLnNlY3VyaXR5LmNyZWRlbnRpYWxtYW5hZ2VyLlNldE1hc3RlclBhc3N3b3JkRGlhbG9nOworCitpbXBvcnQgbmV0LnNmLnRhdmVybmEudDIud29ya2JlbmNoLnVpLmNyZWRlbnRpYWxtYW5hZ2VyLkNyZWRlbnRpYWxNYW5hZ2VyVUk7CitpbXBvcnQgbmV0LnNmLnRhdmVybmEudDIud29ya2JlbmNoLnVpLmNyZWRlbnRpYWxtYW5hZ2VyLkNyeXB0b0ZpbGVGaWx0ZXI7CitpbXBvcnQgbmV0LnNmLnRhdmVybmEudDIud29ya2JlbmNoLnVpLmNyZWRlbnRpYWxtYW5hZ2VyLkVkaXRLZXlQYWlyRW50cnlEaWFsb2c7CitpbXBvcnQgbmV0LnNmLnRhdmVybmEudDIud29ya2JlbmNoLnVpLmNyZWRlbnRpYWxtYW5hZ2VyLkdldFBhc3N3b3JkRGlhbG9nOworaW1wb3J0IG5ldC5zZi50YXZlcm5hLnQyLndvcmtiZW5jaC51aS5jcmVkZW50aWFsbWFuYWdlci5LZXlQYWlyc1RhYmxlTW9kZWw7CitpbXBvcnQgbmV0LnNmLnRhdmVybmEudDIud29ya2JlbmNoLnVpLmNyZWRlbnRpYWxtYW5hZ2VyLk5ld0VkaXRQYXNzd29yZEVudHJ5RGlhbG9nOworaW1wb3J0IG5ldC5zZi50YXZlcm5hLnQyLndvcmtiZW5jaC51aS5jcmVkZW50aWFsbWFuYWdlci5OZXdLZXlQYWlyRW50cnlEaWFsb2c7CitpbXBvcnQgbmV0LnNmLnRhdmVybmEudDIud29ya2JlbmNoLnVpLmNyZWRlbnRpYWxtYW5hZ2VyLk5ld1RydXN0Q2VydHNEaWFsb2c7CitpbXBvcnQgbmV0LnNmLnRhdmVybmEudDIud29ya2JlbmNoLnVpLmNyZWRlbnRpYWxtYW5hZ2VyLlBhc3N3b3Jkc1RhYmxlTW9kZWw7CitpbXBvcnQgbmV0LnNmLnRhdmVybmEudDIud29ya2JlbmNoLnVpLmNyZWRlbnRpYWxtYW5hZ2VyLlRhYmxlQ2VsbFJlbmRlcmVyOworaW1wb3J0IG5ldC5zZi50YXZlcm5hLnQyLndvcmtiZW5jaC51aS5jcmVkZW50aWFsbWFuYWdlci5UYWJsZUhlYWRlclJlbmRlcmVyOworaW1wb3J0IG5ldC5zZi50YXZlcm5hLnQyLndvcmtiZW5jaC51aS5jcmVkZW50aWFsbWFuYWdlci5UcnVzdGVkQ2VydHNUYWJsZU1vZGVsOworaW1wb3J0IG5ldC5zZi50YXZlcm5hLnQyLndvcmtiZW5jaC51aS5jcmVkZW50aWFsbWFuYWdlci5WaWV3Q2VydERldGFpbHNEaWFsb2c7CitpbXBvcnQgbmV0LnNmLnRhdmVybmEudDIud29ya2JlbmNoLnVpLmNyZWRlbnRpYWxtYW5hZ2VyLlZpZXdVc2VybmFtZVBhc3N3b3JkRW50cnlEaWFsb2c7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuYm91bmN5Y2FzdGxlLm9wZW5zc2wuUEVNUmVhZGVyOworaW1wb3J0IG9yZy5ib3VuY3ljYXN0bGUub3BlbnNzbC5QRU1Xcml0ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247CitpbXBvcnQgamF2YXguc3dpbmcuSkZpbGVDaG9vc2VyOworaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKK2ltcG9ydCBqYXZheC5zd2luZy5KT3B0aW9uUGFuZTsKK2ltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7CitpbXBvcnQgamF2YXguc3dpbmcuSlNjcm9sbFBhbmU7CitpbXBvcnQgamF2YXguc3dpbmcuSlRhYmJlZFBhbmU7CitpbXBvcnQgamF2YXguc3dpbmcuSlRhYmxlOworaW1wb3J0IGphdmF4LnN3aW5nLldpbmRvd0NvbnN0YW50czsKK2ltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuRW1wdHlCb3JkZXI7CitpbXBvcnQgamF2YXguc3dpbmcudGFibGUuVGFibGVDb2x1bW47CisKKy8qKgorICogUHJvdmlkZXMgYSBVSSBmb3IgdGhlIENyZWRlbnRpYWwgTWFuYWdlciBmb3IgdXNlcnMgdG8gbWFuYWdlIHRoZWlyIGNyZWRlbnRpYWxzIAorICogc2F2ZWQgYnkgdGhlIENyZWRlbnRpYWwgTWFuYWdlciBpbiBUYXZlcm5hJ3MgS2V5c3RvcmUgYW5kIFRydXN0b3JlLiBDcmVkZW50aWFscworICogaW5jbHVkZSB1c2VybmFtZSBhbmQgcGFzc3dvcmRzIHBhaXJzLCBrZXkgcGFpcnMsIHByb3h5IGtleSBwYWlycyBhbmQgdHJ1c3RlZCAKKyAqIGNlcnRpZmljYXRlcyBvZiBDQSdzIGFuZCBzLgorICogQ3JlZGVudGlhbHMgYXJlIHN0b3JlZCBpbiB0d28gQm91bmN5IENhc3RsZSAiVUJFUiItdHlwZSBrZXlzdG9yZXM6IHRoZQorICogS2V5c3RvcmUgKGNvbnRhaW5pbmcgcGFzc3dvcmRzIGFuZCAobm9ybWFsIGFuZCBwcm94eSkga2V5IHBhaXJzKSBhbmQgdGhlIFRydXN0c3RvcmUgCisgKiAoY29udGFpbmluZyB0cnVzdGVkIGNlcnRpZmljYXRlcykuCisgKiAKKyAqIEBhdXRob3IgQWxleCBOZW5hZGljCisgKi8KKworQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCitwdWJsaWMgY2xhc3MgQ3JlZGVudGlhbE1hbmFnZXJVSSBleHRlbmRzIEpGcmFtZSB7CisKKwkvLyBDcmVkZW50aWFsIE1hbmFnZXIgVUkgc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgQ3JlZGVudGlhbE1hbmFnZXJVSSBJTlNUQU5DRTsKKwkKKwkvLyBMb2dnZXIgCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoQ3JlZGVudGlhbE1hbmFnZXJVSS5jbGFzcyk7CisKKwkvLyBEZWZhdWx0IHRhYmJlZCBwYW5lIHdpZHRoIC0gZGljdGF0ZXMgd2lkdGggb2YgdGhpcyBmcmFtZSAKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9GUkFNRV9XSURUSCA9IDYwMDsKKworCS8vIERlZmF1bHQgdGFiYmVkIHBhbmUgaGVpZ2h0IC0gZGljdGF0ZXMgaGVpZ2h0IG9mIHRoaXMgZnJhbWUgCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfRlJBTUVfSEVJR0hUID0gNDAwOworCisJLy8gQ3JlZGVudGlhbCBNYW5hZ2VyIGljb24gKHdoZW4gZnJhbWUgbWluaW1pc2VkKSAKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZSBjcmVkTWFuYWdlckljb25JbWFnZSA9IFRvb2xraXQuZ2V0RGVmYXVsdFRvb2xraXQoKQorCQkJLmNyZWF0ZUltYWdlKENyZWRlbnRpYWxNYW5hZ2VyVUkuY2xhc3MuZ2V0UmVzb3VyY2UoIi9pbWFnZXMvY3JlZF9tYW5hZ2VyX3RyYW5zcGFyZW50LnBuZyIpKTsKKworCS8vIENyZWRlbnRpYWwgTWFuYWdlciAtIG1hbmFnZXMgYWxsIG9wZXJhdGlvbnMgb24gdGhlIEtleXN0b3JlIGFuZCBUcnVzdHN0b3JlCisJcHVibGljIHN0YXRpYyBDcmVkZW50aWFsTWFuYWdlciBjcmVkTWFuYWdlcjsKKwkKKwkvLyBLZXlzdG9yZSB0YWIgYW5kIHRhYmxlIGNvbnRyb2xzCisJCisJLy8gVGFiYmVkIHBhbmUgdG8gaG9sZCBrZXlzdG9yZSBlbnRyaWVzIHRhYmxlcyAKKwlwcml2YXRlIEpUYWJiZWRQYW5lIGtleVN0b3JlVGFiYmVkUGFuZTsKKworCS8vIFRhYiAxOiBob2xkcyBwYXNzd29yZHMgdGFibGUgCisJcHJpdmF0ZSBKUGFuZWwgcGFzc3dvcmRzVGFiID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KDEwLCAxMCkpOworCisJLy8gVGFiIDE6IG5hbWUgCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkRTID0gIlBhc3N3b3JkcyI7CisKKwkvLyBUYWIgMjogaG9sZHMga2V5IHBhaXJzICh1c2VyIGNlcnRpZmljYXRlcykgdGFibGUgCisJcHJpdmF0ZSBKUGFuZWwga2V5UGFpcnNUYWIgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoMTAsIDEwKSk7CisKKwkvLyBUYWIgMjogbmFtZSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlQQUlSUyA9ICJLZXkgUGFpcnMiOworCQorCS8vIFRhYiAzOiBob2xkcyBrZXkgcGFpcnMgKHVzZXIgY2VydGlmaWNhdGVzKSB0YWJsZSAKKwlwcml2YXRlIEpQYW5lbCBwcm94aWVzVGFiID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KDEwLCAxMCkpOworCisJLy8gVGFiIDM6IG5hbWUgCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWElFUyA9ICJQcm94aWVzIjsKKworCS8vIFRhYiA0OiBob2xkcyB0cnVzdGVkIGNlcnRpZmljYXRlcyB0YWJsZSAKKwlwcml2YXRlIEpQYW5lbCB0cnVzdGVkQ2VydGlmaWNhdGVzVGFiID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KDEwLCAxMCkpOworCisJLy8gVGFiIDQ6IG5hbWUgCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJVU1RFRF9DRVJUSUZJQ0FURVMgPSAiVHJ1c3RlZCBDZXJ0aWZpY2F0ZXMiOworCQorCS8vIFRhYmxlcworCisJLy8gUGFzc3dvcmQgZW50cmllcycgdGFibGUgCisJcHJpdmF0ZSBKVGFibGUgcGFzc3dvcmRzVGFibGU7CisKKwkvLyBLZXkgUGFpciBlbnRyaWVzJyB0YWJsZSAKKwlwcml2YXRlIEpUYWJsZSBrZXlQYWlyc1RhYmxlOworCQorCS8vIFByb3h5IGVudHJpZXMnIHRhYmxlCisJcHJpdmF0ZSBKVGFibGUgcHJveGllc1RhYmxlOworCisJLy8gVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBlbnRyaWVzJyB0YWJsZSAKKwlwcml2YXRlIEpUYWJsZSB0cnVzdGVkQ2VydHNUYWJsZTsKKworCS8vIFZhbHVlIHRvIHBsYWNlIGluIHRoZSBUeXBlIGNvbHVtbiBmb3IgYSBwYXNzd29yZCBlbnRyeQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NXT1JEX0VOVFJZX1RZUEUgPSAiUGFzc3dvcmQiOworCisJLy8gVmFsdWUgdG8gcGxhY2UgaW4gdGhlIFR5cGUgY29sdW1uIGZvciBhIGtleSBwYWlyIGVudHJ5IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QQUlSX0VOVFJZX1RZUEUgPSAiS2V5IFBhaXIiOworCQorCS8vIFZhbHVlIHRvIHBsYWNlIGluIHRoZSBUeXBlIGNvbHVtbiBmb3IgYSBwcm94eSBlbnRyeSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9FTlRSWV9UWVBFID0gIlByb3h5IjsKKworCS8vIFZhbHVlIHRvIHBsYWNlIGluIHRoZSBUeXBlIGNvbHVtbiBmb3IgYSB0cnVzdGVkIGNlcnRpZmljYXRlIGVudHJ5IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSVVNUX0NFUlRfRU5UUllfVFlQRSA9ICJUcnVzdGVkIENlcnRpZmljYXRlIjsKKwkKKwkKKwkvKioKKwkgKiBSZXR1cm5zIGEgQ3JlZGVudGlhbE1hbmFnZXJVSSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBDcmVkZW50aWFsTWFuYWdlclVJIGdldEluc3RhbmNlKCl7CisJCXN5bmNocm9uaXplZCAoQ3JlZGVudGlhbE1hbmFnZXJVSS5jbGFzcykgeworCQkJaWYgKElOU1RBTkNFID09IG51bGwpCisJCQkJdHJ5IHsKKwkJCQkJSU5TVEFOQ0UgPSBuZXcgQ3JlZGVudGlhbE1hbmFnZXJVSSgpOworCQkJCX0gY2F0Y2ggKENNRXhjZXB0aW9uIGNtZSkgeworCQkJCQkvLyBGYWlsZWQgdG8gaW5zdGFudGlhdGUgQ3JlZGVudGlhbCBNYW5hZ2VyIC0gd2FybiB0aGUgdXNlciBhbmQgZXhpdAorCQkJCQlTdHJpbmcgZXhNZXNzYWdlID0gIkZhaWxlZCB0byBpbnN0YW50aWF0ZSBDcmVkZW50aWFsIE1hbmFnZXIuICIgKyBjbWUuZ2V0TWVzc2FnZSgpOworCQkJCQlsb2dnZXIuZXJyb3IoZXhNZXNzYWdlKTsKKwkJCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2cobmV3IEpGcmFtZSgpLCBleE1lc3NhZ2UsCisJCQkJCQkJIkNyZWRlbnRpYWwgTWFuYWdlciBFcnJvciIsIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOworCQkJCX0KKwkJfQorCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogT3ZlcnJpZGVzIHRoZSBPYmplY3TVcyBjbG9uZSBtZXRob2QgdG8gcHJldmVudCB0aGUgc2luZ2xldG9uIG9iamVjdCB0byBiZQorCSAqIGNsb25lZC4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGNsb25lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKKwkJdGhyb3cgbmV3IENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgQ3JlZGVudGlhbCBNYW5hZ2VyIFVJJ3MgZnJhbWUuCisJICovCisJcHJpdmF0ZSBDcmVkZW50aWFsTWFuYWdlclVJKCkgdGhyb3dzIENNRXhjZXB0aW9uCisJeworCisJCS8vIEluc3RhbnRpYXRlIENyZWRlbnRpYWwgTWFuYWdlciB0aGF0IHdpbGwgcGVyZm9ybSBhbGwgCisJCS8vIG9wZXJhdGlvbnMgb24gdGhlIEtleXN0b3JlIGFuZCBUcnVzdHN0b3JlCisJCWNyZWRNYW5hZ2VyID0gQ3JlZGVudGlhbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKKwkJCisgICAgICAgIC8vIEluaXRpYWxpc2UgdGhlIFVJIGNvbXBvbmVudHMKKwkJaW5pdENvbXBvbmVudHMoKTsJCQorCX0KKwkKKwlwcml2YXRlIHZvaWQgaW5pdENvbXBvbmVudHMoKXsKKworCQkvLyBJbml0aWFsaXNlIHRoZSB0YWJiZWQgcGFuZSB0aGF0IGNvbnRhaW5zIHRoZSB0YWJzIHdpdGggdGFidWxhcgorCQkvLyByZXByZXNlbnRhdGlvbnMgb2YgdGhlIEtleXN0b3JlJ3MgY29udGVudC4KKwkJa2V5U3RvcmVUYWJiZWRQYW5lID0gbmV3IEpUYWJiZWRQYW5lKCk7CisJCS8vIEluaXRpYWxpc2UgdGhlIHRhYiBjb250YWluaW5nIHRoZSB0YWJsZSBmb3IgdXNlcm5hbWUvcGFzc3dvcmQgZW50cmllcyBmcm9tIHRoZQorCQkvLyBLZXlzdG9yZQorCQlwYXNzd29yZHNUYWJsZSA9IGluaXRUYWJsZShQQVNTV09SRFMsIHBhc3N3b3Jkc1RhYik7CisJCS8vIEluaXRpYWxpc2UgdGhlIHRhYiBjb250YWluaW5nIHRoZSB0YWJsZSBmb3Iga2V5IHBhaXIgZW50cmllcyBmcm9tIHRoZQorCQkvLyBLZXlzdG9yZQorCQlrZXlQYWlyc1RhYmxlID0gaW5pdFRhYmxlKEtFWVBBSVJTLCBrZXlQYWlyc1RhYik7CisJCS8vIEluaXRpYWxpc2UgdGhlIHRhYiBjb250YWluaW5nIHRoZSB0YWJsZSBmb3IgcHJveHkgZW50cmllcyBmcm9tIHRoZQorCQkvLyBLZXlzdG9yZQorCQlwcm94aWVzVGFibGUgPSBpbml0VGFibGUoUFJPWElFUywgcHJveGllc1RhYik7CisJCS8vIEluaXRpYWxpc2UgdGhlIHRhYiBjb250YWluaW5nIHRoZSB0YWJsZSBmb3IgdHJ1c3RlZCBjZXJ0aWZpY2F0ZQorCQkvLyBlbnRyaWVzIGZyb20gdGhlIFRydXN0c3RvcmUKKwkJdHJ1c3RlZENlcnRzVGFibGUgPSBpbml0VGFibGUoVFJVU1RFRF9DRVJUSUZJQ0FURVMsCisJCQkJdHJ1c3RlZENlcnRpZmljYXRlc1RhYik7CisJCS8vIFNldCB0aGUgc2l6ZSBvZiB0aGUgdGFiYmVkIHBhbmUgdG8gdGhlIHByZWZlcnJlZCBzaXplIC0gdGhlIHNpemUgb2YKKwkJLy8gdGhlIG1haW4gYXBwbGljYXRpb24gZnJhbWUgZGVwZW5kcyBvbiBpdC4KKwkJa2V5U3RvcmVUYWJiZWRQYW5lLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbihERUZBVUxUX0ZSQU1FX1dJRFRILAorCQkJCURFRkFVTFRfRlJBTUVfSEVJR0hUKSk7CisJCQorCQkvLyBCdXR0b24gZm9yIGNoYW5naW5nIENyZWRlbnRpYWwgTWFuYWdlcidzIG1hc3RlciBwYXNzd29yZAorCQlKQnV0dG9uIGNoYW5nZU1hc3RlclBhc3N3b3JkQnV0dG9uID0gbmV3IEpCdXR0b24oIkNoYW5nZSBtYXN0ZXIgcGFzc3dvcmQiKTsKKwkJY2hhbmdlTWFzdGVyUGFzc3dvcmRCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCl7CisJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgeworCQkJCWNoYW5nZU1hc3RlclBhc3N3b3JkKCk7CisJCQl9fSk7CisJCUpQYW5lbCBjaGFuZ2VNYXN0ZXJQYXNzd29yZFBhbmVsID0gbmV3IEpQYW5lbChuZXcgRmxvd0xheW91dChGbG93TGF5b3V0LlJJR0hUKSk7CisJCWNoYW5nZU1hc3RlclBhc3N3b3JkUGFuZWwuYWRkKGNoYW5nZU1hc3RlclBhc3N3b3JkQnV0dG9uKTsKKwkJCisJCS8vIEFkZCBjaGFuZ2UgbWFzdGVyIHBhc3N3b3JkIHRvIHRoZSBtYWluIGFwcGxpY2F0aW9uIGZyYW1lCisJCWdldENvbnRlbnRQYW5lKCkuYWRkKGNoYW5nZU1hc3RlclBhc3N3b3JkUGFuZWwsIEJvcmRlckxheW91dC5OT1JUSCk7CisJCS8vIEFkZCB0YWJiZWQgcGFuZSB0byB0aGUgbWFpbiBhcHBsaWNhdGlvbiBmcmFtZQorCQlnZXRDb250ZW50UGFuZSgpLmFkZChrZXlTdG9yZVRhYmJlZFBhbmUsIEJvcmRlckxheW91dC5DRU5URVIpOworCisJCS8vIEhhbmRsZSBhcHBsaWNhdGlvbiBjbG9zZQorCQlhZGRXaW5kb3dMaXN0ZW5lcihuZXcgV2luZG93QWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZXZ0KSB7CisJCQkJY2xvc2VGcmFtZSgpOworCQkJfQorCQl9KTsKKwkJc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKFdpbmRvd0NvbnN0YW50cy5ET19OT1RISU5HX09OX0NMT1NFKTsKKworCQlwYWNrKCk7CisKKwkJLy8gQ2VudHJlIHRoZSBmcmFtZSBpbiB0aGUgY2VudHJlIG9mIHRoZSBkZXNrdG9wCisJCXNldExvY2F0aW9uUmVsYXRpdmVUbyhudWxsKTsKKworCQkvLyBTZXQgdGhlIGZyYW1lJ3MgaWNvbgorCQlzZXRJY29uSW1hZ2UoY3JlZE1hbmFnZXJJY29uSW1hZ2UpOworCisJCS8vIFNldCB0aGUgZnJhbWUncyB0aXRsZQorCQlzZXRUaXRsZSgiQ3JlZGVudGlhbCBNYW5hZ2VyIik7CisKKwkJLy9zZXRNb2RhbCh0cnVlKTsKKwkJLy9zZXRWaXNpYmxlKHRydWUpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VNYXN0ZXJQYXNzd29yZCgpIHsKKworCQlTZXRNYXN0ZXJQYXNzd29yZERpYWxvZyBjaGFuZ2VQYXNzd29yZERpYWxvZyA9IG5ldyBTZXRNYXN0ZXJQYXNzd29yZERpYWxvZyh0aGlzLCAiQ2hhbmdlIG1hc3RlciBwYXNzd29yZCIsIHRydWUgLCAiQ2hhbmdlIG1hc3RlciBwYXNzd29yZCBmb3IgQ3JlZGVudGlhbCBNYW5hZ2VyIik7CisJCWNoYW5nZVBhc3N3b3JkRGlhbG9nLnNldExvY2F0aW9uUmVsYXRpdmVUbyhudWxsKTsKKwkJY2hhbmdlUGFzc3dvcmREaWFsb2cuc2V0VmlzaWJsZSh0cnVlKTsKKwkJU3RyaW5nIHBhc3N3b3JkID0gY2hhbmdlUGFzc3dvcmREaWFsb2cuZ2V0UGFzc3dvcmQoKTsKKwkJaWYgKHBhc3N3b3JkID09IG51bGwpeyAvLyB1c2VyIGNhbmNlbGxlZAorCQkJcmV0dXJuOyAvLyBkbyBub3RoaW5nCisJCX0KKwkJZWxzZXsKKwkJCXRyeSB7CisJCQkJY3JlZE1hbmFnZXIuY2hhbmdlTWFzdGVyUGFzc3dvcmQocGFzc3dvcmQpOworCQkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKG5ldyBKRnJhbWUoKSwgIk1hc3RlciBwYXNzd29yZCBjaGFuZ2VkIHN1Y2Vzc2Z1bGx5IiwKKwkJCQkJCSJDcmVkZW50aWFsIE1hbmFnZXIgRXJyb3IiLCBKT3B0aW9uUGFuZS5JTkZPUk1BVElPTl9NRVNTQUdFKTsKKwkJCX0gY2F0Y2ggKENNRXhjZXB0aW9uIGNtZSkgeworCQkJCS8vIEZhaWxlZCB0byBjaGFuZ2UgdGhlIG1hc3RlciBwYXNzd29yZCBmb3IgQ3JlZGVudGlhbCBNYW5hZ2VyIC0gd2FybiB0aGUgdXNlcgorCQkJCVN0cmluZyBleE1lc3NhZ2UgPSAiRmFpbGVkIHRvIGNoYW5nZSBtYXN0ZXIgcGFzc3dvcmQgZm9yIENyZWRlbnRpYWwgTWFuYWdlciI7CisJCQkJbG9nZ2VyLmVycm9yKGV4TWVzc2FnZSk7CisJCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2cobmV3IEpGcmFtZSgpLCBleE1lc3NhZ2UsCisJCQkJCQkiQ3JlZGVudGlhbCBNYW5hZ2VyIEVycm9yIiwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBJbml0aWFsaXNlIHRoZSB0YWIgb24gdGhlIHRhYmJlZCBwYW5lIGFuZCBpdHMgdGFidWxhciBjb250ZW50LgorCSAqLworCXByaXZhdGUgSlRhYmxlIGluaXRUYWJsZShTdHJpbmcgdGFibGVUeXBlLCBKUGFuZWwgdGFiKSB7CisKKwkJSlRhYmxlIHRhYmxlID0gbnVsbDsKKworCQlpZiAodGFibGVUeXBlLmVxdWFscyhQQVNTV09SRFMpKSB7IC8vIFBhc3N3b3JkcyB0YWJsZQorCQkJLy8gVGhlIFBhc3N3b3JkcyB0YWJsZSdzIGRhdGEgbW9kZWwKKwkJCVBhc3N3b3Jkc1RhYmxlTW9kZWwgcGFzc3dvcmRzVGFibGVNb2RlbCA9IG5ldyBQYXNzd29yZHNUYWJsZU1vZGVsKCk7CisJCQkvLyBUaGUgdGFibGUgaXRzZWxmCisJCQl0YWJsZSA9IG5ldyBKVGFibGUocGFzc3dvcmRzVGFibGVNb2RlbCk7CisKKwkJCS8vIFNldCB0aGUgcGFzc3dvcmQgYW5kIGFsaWFzIGNvbHVtbnMgb2YgdGhlIFBhc3N3b3JkcyB0YWJsZSB0byBiZQorCQkJLy8gaW52aXNpYmxlIGJ5IHJlbW92aW5nIHRoZW0gZnJvbSB0aGUgY29sdW1uIG1vZGVsICh0aGV5IHdpbGwgc3RpbGwgcHJlc2VudAorCQkJLy8gaW4gdGhlIHRhYmxlIG1vZGVsKQorCQkJLy8gUmVtb3ZlIHRoZSBsYXN0IGNvbHVtbiBmaXJzdAorCQkJVGFibGVDb2x1bW4gYWxpYXNDb2x1bW4gPSB0YWJsZS5nZXRDb2x1bW5Nb2RlbCgpLmdldENvbHVtbig1KTsKKwkJCXRhYmxlLmdldENvbHVtbk1vZGVsKCkucmVtb3ZlQ29sdW1uKGFsaWFzQ29sdW1uKTsKKwkJCVRhYmxlQ29sdW1uIHBhc3N3b3JkQ29sdW1uID0gdGFibGUuZ2V0Q29sdW1uTW9kZWwoKS5nZXRDb2x1bW4oNCk7CisJCQl0YWJsZS5nZXRDb2x1bW5Nb2RlbCgpLnJlbW92ZUNvbHVtbihwYXNzd29yZENvbHVtbik7CisKKwkJCS8vIEJ1dHRvbnMKKwkJCUpCdXR0b24gbmV3UGFzc3dvcmRCdXR0b24gPSBuZXcgSkJ1dHRvbigiTmV3Iik7CisJCQluZXdQYXNzd29yZEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKXsKKwkJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgeworCQkJCQluZXdQYXNzd29yZCgpOworCQkJCX19KTsKKwkJCUpCdXR0b24gdmlld1Bhc3N3b3JkQnV0dG9uID0gbmV3IEpCdXR0b24oIkRldGFpbHMiKTsKKwkJCXZpZXdQYXNzd29yZEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKXsKKwkJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgeworCQkJCQl2aWV3UGFzc3dvcmQoKTsKKwkJCQl9fSk7CisJCQlKQnV0dG9uIGVkaXRQYXNzd29yZEJ1dHRvbiA9IG5ldyBKQnV0dG9uKCJFZGl0Iik7CisJCQllZGl0UGFzc3dvcmRCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCl7CisJCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKKwkJCQkJZWRpdFBhc3N3b3JkKCk7CisJCQkJfX0pOworCQkJSkJ1dHRvbiBkZWxldGVQYXNzd29yZEJ1dHRvbiA9IG5ldyBKQnV0dG9uKCJEZWxldGUiKTsKKwkJCWRlbGV0ZVBhc3N3b3JkQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpeworCQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7CisJCQkJCWRlbGV0ZVBhc3N3b3JkKCk7CisJCQkJfX0pOworCQkJCisJCQkvLyBQYW5lbCB0byBob2xkIHRoZSBidXR0b25zCisJCQlKUGFuZWwgYnAgPSBuZXcgSlBhbmVsKCk7CisJCQlicC5hZGQodmlld1Bhc3N3b3JkQnV0dG9uKTsKKwkJCWJwLmFkZChlZGl0UGFzc3dvcmRCdXR0b24pOworCQkJYnAuYWRkKG5ld1Bhc3N3b3JkQnV0dG9uKTsKKwkJCWJwLmFkZChkZWxldGVQYXNzd29yZEJ1dHRvbik7CisKKwkJCS8vIEFkZCBidXR0b24gcGFuZWwgdG8gdGhlIHRhYgorCQkJdGFiLmFkZChicCwgQm9yZGVyTGF5b3V0LlBBR0VfRU5EKTsKKworCQl9IAorCQllbHNlIGlmICh0YWJsZVR5cGUuZXF1YWxzKEtFWVBBSVJTKSkgeyAvLyBLZXkgUGFpcnMgdGFiCisJCQkvLyBUaGUgS2V5IFBhaXJzIHRhYmxlJ3MgZGF0YSBtb2RlbAorCQkJS2V5UGFpcnNUYWJsZU1vZGVsIGtleVBhaXJzVGFibGVNb2RlbCA9IG5ldyBLZXlQYWlyc1RhYmxlTW9kZWwoKTsKKwkJCS8vIFRoZSB0YWJsZSBpdHNlbGYKKwkJCXRhYmxlID0gbmV3IEpUYWJsZShrZXlQYWlyc1RhYmxlTW9kZWwpOworCisJCQkvLyBTZXQgdGhlIGFsaWFzIGFuZCBzZXJ2aWNlIFVSTHMgY29sdW1ucyBvZiB0aGUgS2F5UGFpcnMgdGFibGUgdG8gYmUKKwkJCS8vIGludmlzaWJsZSBieSByZW1vdmluZyB0aGVtIGZyb20gdGhlIGNvbHVtbiBtb2RlbCAodGhleSB3aWxsIHN0aWxsIHByZXNlbnQKKwkJCS8vIGluIHRoZSB0YWJsZSBtb2RlbCkKKwkJCS8vIFJlbW92ZSB0aGUgbGFzdCBjb2x1bW4gZmlyc3QKKwkJCVRhYmxlQ29sdW1uIGFsaWFzQ29sdW1uID0gdGFibGUuZ2V0Q29sdW1uTW9kZWwoKS5nZXRDb2x1bW4oNik7IAorCQkJdGFibGUuZ2V0Q29sdW1uTW9kZWwoKS5yZW1vdmVDb2x1bW4oYWxpYXNDb2x1bW4pOworCQkJVGFibGVDb2x1bW4gc2VydmljZVVSTHNDb2x1bW4gPSB0YWJsZS5nZXRDb2x1bW5Nb2RlbCgpLmdldENvbHVtbig1KTsKKwkJCXRhYmxlLmdldENvbHVtbk1vZGVsKCkucmVtb3ZlQ29sdW1uKHNlcnZpY2VVUkxzQ29sdW1uKTsKKworCQkJLy8gQnV0dG9ucworCQkJSkJ1dHRvbiB2aWV3S2V5UGFpckJ1dHRvbiA9IG5ldyBKQnV0dG9uKCJEZXRhaWxzIik7CisJCQl2aWV3S2V5UGFpckJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKXsKKwkJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgeworCQkJCQl2aWV3Q2VydGlmaWNhdGUoKTsKKwkJCQl9fSk7CisJCQlKQnV0dG9uIGVkaXRTZXJ2aWNlVVJMS2V5UGFpckJ1dHRvbiA9IG5ldyBKQnV0dG9uKCJFZGl0Iik7CisJCQllZGl0U2VydmljZVVSTEtleVBhaXJCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCl7CisJCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKKwkJCQkJZWRpdEtleVBhaXIoKTsKKwkJCQl9fSk7CisJCQlKQnV0dG9uIGltcG9ydEtleVBhaXJCdXR0b24gPSBuZXcgSkJ1dHRvbigiSW1wb3J0Iik7CisJCQlpbXBvcnRLZXlQYWlyQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpeworCQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7CisJCQkJCW5ld0tleVBhaXIoKTsKKwkJCQl9fSk7CisJCQlKQnV0dG9uIGV4cG9ydEtleVBhaXJCdXR0b24gPSBuZXcgSkJ1dHRvbigiRXhwb3J0Iik7CisJCQlleHBvcnRLZXlQYWlyQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpeworCQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7CisJCQkJCWV4cG9ydEtleVBhaXIoKTsKKwkJCQl9fSk7CisJCQlKQnV0dG9uIGRlbGV0ZUtleVBhaXJCdXR0b24gPSBuZXcgSkJ1dHRvbigiRGVsZXRlIik7CisJCQlkZWxldGVLZXlQYWlyQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpeworCQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7CisJCQkJCWRlbGV0ZUtleVBhaXIoKTsKKwkJCQl9fSk7CisKKwkJCS8vIFBhbmVsIHRvIGhvbGQgdGhlIGJ1dHRvbnMKKwkJCUpQYW5lbCBicCA9IG5ldyBKUGFuZWwoKTsKKwkJCWJwLmFkZCh2aWV3S2V5UGFpckJ1dHRvbik7CisJCQlicC5hZGQoZWRpdFNlcnZpY2VVUkxLZXlQYWlyQnV0dG9uKTsKKwkJCWJwLmFkZChpbXBvcnRLZXlQYWlyQnV0dG9uKTsKKwkJCWJwLmFkZChleHBvcnRLZXlQYWlyQnV0dG9uKTsKKwkJCWJwLmFkZChkZWxldGVLZXlQYWlyQnV0dG9uKTsKKworCQkJLy8gQWRkIGJ1dHRvbiBwYW5lbCB0byB0aGUgdGFiCisJCQl0YWIuYWRkKGJwLCBCb3JkZXJMYXlvdXQuUEFHRV9FTkQpOworCisJCX0gCisJCWVsc2UgaWYgKHRhYmxlVHlwZS5lcXVhbHMoUFJPWElFUykpIHsgLy8gUHJveGllcyB0YWIKKwkJCS8vIFRoZSBQcm94aWVzIHRhYmxlJ3MgZGF0YSBtb2RlbAorCQkJUHJveGllc1RhYmxlTW9kZWwgcHJveGllc1RhYmxlTW9kZWwgPSBuZXcgUHJveGllc1RhYmxlTW9kZWwoKTsKKwkJCQorCQkJLy8gVGhlIHRhYmxlIGl0c2VsZgorCQkJdGFibGUgPSBuZXcgSlRhYmxlKHByb3hpZXNUYWJsZU1vZGVsKTsKKworCQkJLy8gU2V0IGFsaWFzIGNvbHVtbiBvZiB0aGUgUHJveGllcyB0YWJsZSB0byBiZQorCQkJLy8gaW52aXNpYmxlIGJ5IHJlbW92aW5nIGl0IGZyb20gdGhlIGNvbHVtbiBtb2RlbCAoaXQgd2lsbCBzdGlsbCBwcmVzZW50CisJCQkvLyBpbiB0aGUgdGFibGUgbW9kZWwpCisJCQlUYWJsZUNvbHVtbiBhbGlhc0NvbHVtbiA9IHRhYmxlLmdldENvbHVtbk1vZGVsKCkuZ2V0Q29sdW1uKDUpOyAKKwkJCXRhYmxlLmdldENvbHVtbk1vZGVsKCkucmVtb3ZlQ29sdW1uKGFsaWFzQ29sdW1uKTsKKworCQkJLy8gQnV0dG9ucworCQkJSkJ1dHRvbiB2aWV3UHJveHlCdXR0b24gPSBuZXcgSkJ1dHRvbigiRGV0YWlscyIpOworCQkJdmlld1Byb3h5QnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpeworCQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7CisJCQkJCXZpZXdQcm94eUNlcnRpZmljYXRlKCk7CisJCQkJfX0pOworCQkJSkJ1dHRvbiBkZWxldGVQcm94eUJ1dHRvbiA9IG5ldyBKQnV0dG9uKCJEZWxldGUiKTsKKwkJCWRlbGV0ZVByb3h5QnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpeworCQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7CisJCQkJCWRlbGV0ZVByb3h5KCk7CisJCQkJfX0pOworCQkJCisKKwkJCS8vIFBhbmVsIHRvIGhvbGQgdGhlIGJ1dHRvbnMKKwkJCUpQYW5lbCBicCA9IG5ldyBKUGFuZWwoKTsKKwkJCWJwLmFkZCh2aWV3UHJveHlCdXR0b24pOworCQkJYnAuYWRkKGRlbGV0ZVByb3h5QnV0dG9uKTsKKwkJCQorCQkJLy8gQWRkIGJ1dHRvbiBwYW5lbCB0byB0aGUgdGFiCisJCQl0YWIuYWRkKGJwLCBCb3JkZXJMYXlvdXQuUEFHRV9FTkQpOworCisJCX0gCisJCWVsc2UgaWYgKHRhYmxlVHlwZS5lcXVhbHMoVFJVU1RFRF9DRVJUSUZJQ0FURVMpKSB7IC8vIFRydXN0ZWQgQ2VydGlmaWNhdGVzIHRhYgorCQkJLy8gVGhlIFRydXN0ZWQgQ2VydGlmaWNhdGUgdGFibGUncyBkYXRhIG1vZGVsCisJCQlUcnVzdGVkQ2VydHNUYWJsZU1vZGVsIHRydXN0ZWRDZXJ0aWZpY2F0ZXNUYWJsZU1vZGVsID0gbmV3IFRydXN0ZWRDZXJ0c1RhYmxlTW9kZWwoKTsKKwkJCS8vIFRoZSB0YWJsZSBpdHNlbGYKKwkJCXRhYmxlID0gbmV3IEpUYWJsZSh0cnVzdGVkQ2VydGlmaWNhdGVzVGFibGVNb2RlbCk7CisKKwkJCS8vIFNldCB0aGUgYWxpYXMgY29sdW1uIG9mIHRoZSBUcnVzdGVkIENlcnRzIHRhYmxlIHRvIGJlIGludmlzaWJsZQorCQkJLy8gYnkgcmVtb3ZpbmcgaXQgZnJvbSB0aGUgY29sdW1uIG1vZGVsIChpdCBpcyBzdGlsbCBwcmVzZW50IGluIHRoZQorCQkJLy8gdGFibGUgbW9kZWwpCisJCQlUYWJsZUNvbHVtbiBhbGlhc0NvbHVtbiA9IHRhYmxlLmdldENvbHVtbk1vZGVsKCkuZ2V0Q29sdW1uKDUpOworCQkJdGFibGUuZ2V0Q29sdW1uTW9kZWwoKS5yZW1vdmVDb2x1bW4oYWxpYXNDb2x1bW4pOworCisJCQkvLyBCdXR0b25zCisJCQlKQnV0dG9uIHZpZXdUcnVzdGVkQ2VydGlmaWNhdGVCdXR0b24gPSBuZXcgSkJ1dHRvbigiRGV0YWlscyIpOworCQkJdmlld1RydXN0ZWRDZXJ0aWZpY2F0ZUJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKXsKKwkJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgeworCQkJCQl2aWV3Q2VydGlmaWNhdGUoKTsKKwkJCQl9fSk7CisJCQlKQnV0dG9uIGltcG9ydFRydXN0ZWRDZXJ0aWZpY2F0ZUJ1dHRvbiA9IG5ldyBKQnV0dG9uKCJJbXBvcnQiKTsKKwkJCWltcG9ydFRydXN0ZWRDZXJ0aWZpY2F0ZUJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKXsKKwkJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgeworCQkJCQlpbXBvcnRUcnVzdGVkQ2VydGlmaWNhdGUoKTsKKwkJCQl9fSk7CisJCQlKQnV0dG9uIGV4cG9ydFRydXN0ZWRDZXJ0aWZpY2F0ZUJ1dHRvbiA9IG5ldyBKQnV0dG9uKCJFeHBvcnQiKTsKKwkJCWV4cG9ydFRydXN0ZWRDZXJ0aWZpY2F0ZUJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKXsKKwkJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgeworCQkJCQlleHBvcnRUcnVzdGVkQ2VydGlmaWNhdGUoKTsKKwkJCQl9fSk7CisJCQlKQnV0dG9uIGRlbGV0ZVRydXN0ZWRDZXJ0aWZpY2F0ZUJ1dHRvbiA9IG5ldyBKQnV0dG9uKCJEZWxldGUiKTsKKwkJCWRlbGV0ZVRydXN0ZWRDZXJ0aWZpY2F0ZUJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKXsKKwkJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgeworCQkJCQlkZWxldGVUcnVzdGVkQ2VydGlmaWNhdGUoKTsKKwkJCQl9fSk7CisKKwkJCS8vIFBhbmVsIHRvIGhvbGQgdGhlIGJ1dHRvbnMKKwkJCUpQYW5lbCBicCA9IG5ldyBKUGFuZWwoKTsKKwkJCWJwLmFkZCh2aWV3VHJ1c3RlZENlcnRpZmljYXRlQnV0dG9uKTsKKwkJCWJwLmFkZChpbXBvcnRUcnVzdGVkQ2VydGlmaWNhdGVCdXR0b24pOworCQkJYnAuYWRkKGV4cG9ydFRydXN0ZWRDZXJ0aWZpY2F0ZUJ1dHRvbik7CisJCQlicC5hZGQoZGVsZXRlVHJ1c3RlZENlcnRpZmljYXRlQnV0dG9uKTsKKworCQkJLy8gQWRkIGJ1dHRvbiBwYW5lbCB0byB0aGUgdGFiCisJCQl0YWIuYWRkKGJwLCBCb3JkZXJMYXlvdXQuUEFHRV9FTkQpOworCQl9CisKKwkJdGFibGUuc2V0U2hvd0dyaWQoZmFsc2UpOworCQl0YWJsZS5zZXRSb3dNYXJnaW4oMCk7CisJCXRhYmxlLmdldENvbHVtbk1vZGVsKCkuc2V0Q29sdW1uTWFyZ2luKDApOworCQl0YWJsZS5nZXRUYWJsZUhlYWRlcigpLnNldFJlb3JkZXJpbmdBbGxvd2VkKGZhbHNlKTsKKwkJdGFibGUuc2V0QXV0b1Jlc2l6ZU1vZGUoSlRhYmxlLkFVVE9fUkVTSVpFX0FMTF9DT0xVTU5TKTsKKwkJLy8gVG9wIGFjY29tbW9kYXRlcyBlbnRyeSBpY29ucyB3aXRoIDIgcGl4ZWxzIHNwYXJlIHNwYWNlIChpbWFnZXMgYXJlIDE2eDE2IHBpeGVscykKKwkJdGFibGUuc2V0Um93SGVpZ2h0KDE4KTsKKworCQkvLyBBZGQgY3VzdG9tIHJlbmRlcnJlcnMgZm9yIHRoZSB0YWJsZSBoZWFkZXJzIGFuZCBjZWxscworCQlmb3IgKGludCBpQ250ID0gMDsgaUNudCA8IHRhYmxlLmdldENvbHVtbkNvdW50KCk7IGlDbnQrKykgeworCQkJVGFibGVDb2x1bW4gY29sdW1uID0gdGFibGUuZ2V0Q29sdW1uTW9kZWwoKS5nZXRDb2x1bW4oaUNudCk7CisJCQljb2x1bW4uc2V0SGVhZGVyUmVuZGVyZXIobmV3IFRhYmxlSGVhZGVyUmVuZGVyZXIoKSk7CisJCQljb2x1bW4uc2V0Q2VsbFJlbmRlcmVyKG5ldyBUYWJsZUNlbGxSZW5kZXJlcigpKTsKKwkJfQorCisJCS8vIE1ha2UgdGhlIGZpcnN0IGNvbHVtbiBzbWFsbCBhbmQgbm90IHJlc2l6YWJsZSAoaXQgaG9sZHMgaWNvbnMgdG8KKwkJLy8gcmVwcmVzZW50IGRpZmZlcmVudCBlbnRyeSB0eXBlcykKKwkJVGFibGVDb2x1bW4gdHlwZUNvbCA9IHRhYmxlLmdldENvbHVtbk1vZGVsKCkuZ2V0Q29sdW1uKDApOworCQl0eXBlQ29sLnNldFJlc2l6YWJsZShmYWxzZSk7CisJCXR5cGVDb2wuc2V0TWluV2lkdGgoMjApOworCQl0eXBlQ29sLnNldE1heFdpZHRoKDIwKTsKKwkJdHlwZUNvbC5zZXRQcmVmZXJyZWRXaWR0aCgyMCk7CisKKwkJLy8gU2V0IHRoZSBzaXplIGZvciB0aGUgc2Vjb25kIGNvbHVtbgorCQkvLyAoaS5lLiBTZXJ2aWNlIFVSTCBjb2x1bW4gb2YgUGFzc3dvcmRzIGFuZCBLZXkgUGFpcnMgdGFibGVzLCBhbmQKKwkJLy8gQ2VydGlmaWNhdGUgTmFtZSBjb2x1bW4gb2YgdGhlIFRydXN0ZWQgQ2VydGlmaWNhdGVzIHRhYmxlKQorCQlUYWJsZUNvbHVtbiBzZWNvbmRDb2wgPSB0YWJsZS5nZXRDb2x1bW5Nb2RlbCgpLmdldENvbHVtbigxKTsKKwkJc2Vjb25kQ29sLnNldE1pbldpZHRoKDIwKTsKKwkJc2Vjb25kQ29sLnNldE1heFdpZHRoKDEwMDAwKTsKKwkJc2Vjb25kQ29sLnNldFByZWZlcnJlZFdpZHRoKDMwMCk7CisKKwkJLy8gRG9uJ3QgY2FyZSBhYm91dCB0aGUgc2l6ZSBvZiBvdGhlciBjb2x1bW5zCisKKwkJLy8gUHV0IHRoZSB0YWJsZSBpbnRvIGEgc2Nyb2xsIHBhbmUKKwkJSlNjcm9sbFBhbmUganNwVGFibGVTY3JvbGxQYW5lID0gbmV3IEpTY3JvbGxQYW5lKHRhYmxlLAorCQkJCUpTY3JvbGxQYW5lLlZFUlRJQ0FMX1NDUk9MTEJBUl9BU19ORUVERUQsCisJCQkJSlNjcm9sbFBhbmUuSE9SSVpPTlRBTF9TQ1JPTExCQVJfQVNfTkVFREVEKTsKKwkJanNwVGFibGVTY3JvbGxQYW5lLmdldFZpZXdwb3J0KCkuc2V0QmFja2dyb3VuZCh0YWJsZS5nZXRCYWNrZ3JvdW5kKCkpOworCisJCS8vIFB1dCB0aGUgc2Nyb2xsIHBhbmUgb24gdGhlIHRhYiBwYW5lbAorCQl0YWIuYWRkKGpzcFRhYmxlU2Nyb2xsUGFuZSwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisJCWpzcFRhYmxlU2Nyb2xsUGFuZS5zZXRCb3JkZXIobmV3IEVtcHR5Qm9yZGVyKDMsIDMsIDMsIDMpKTsKKworCQkvLyBBZGQgbW91c2UgbGlzdGVuZXJzIHRvIHNob3cgYW4gZW50cnkncyBkZXRhaWxzIGlmIGl0IGlzCisJCS8vIGRvdWJsZS1jbGlja2VkCisJCXRhYmxlLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIG1vdXNlQ2xpY2tlZChNb3VzZUV2ZW50IGV2dCkgeworCQkJCXRhYmxlRG91YmxlQ2xpY2soZXZ0KTsKKwkJCX0KKwkJfSk7CisKKwkJLy8gQWRkIHRoZSB0YWIgdG8gdGhlIHRhYmJlZCBwYW5lCisJCWtleVN0b3JlVGFiYmVkUGFuZS5hZGRUYWIodGFibGVUeXBlLCB0YWIpOworCisJCXJldHVybiB0YWJsZTsKKwl9CisJCisJLyoqCisJICogRGlzcGxheSB0aGUgdXNlcm5hbWUvcGFzc3dvcmQgcGFpciBlbnRyeSBmcm9tIHRoZSBLZXlzdG9yZS4KKwkgKi8KKwlwcml2YXRlIHZvaWQgdmlld1Bhc3N3b3JkKCkgeworCQkvLyBXaGljaCB1c2VybmFtZS9wYXNzd29yZCBwYWlyIGVudHJ5IGhhcyBiZWVuIHNlbGVjdGVkLCBpZiBhbnk/CisJCWludCBpUm93ID0gcGFzc3dvcmRzVGFibGUuZ2V0U2VsZWN0ZWRSb3coKTsKKwkJaWYgKGlSb3cgPT0gLTEpIHsgLy8gbm8gcm93IGN1cnJlbnRseSBzZWxlY3RlZAorCQkJcmV0dXJuOworCQl9CisKKwkJLy8gR2V0IGN1cnJlbnQgdmFsdWVzIGZvciBzZXJ2aWNlIFVSTCwgdXNlcm5hbWUgYW5kIHBhc3N3b3JkCisJCVN0cmluZyBzZXJ2aWNlVVJMID0gKFN0cmluZykgcGFzc3dvcmRzVGFibGUuZ2V0VmFsdWVBdChpUm93LCAxKTsgLy8gY3VycmVudCBlbnRyeSdzIHNlcnZpY2UgVVJMCisKKwkJU3RyaW5nIHVzZXJuYW1lID0gKFN0cmluZykgcGFzc3dvcmRzVGFibGUuZ2V0VmFsdWVBdChpUm93LCAyKTsgLy8gY3VycmVudCBlbnRyeSdzIHVzZXJuYW1lCisKKwkJLy8gQmVjYXVzZSB0aGUgcGFzc3dvcmQgY29sdW1uIGlzIG5vdCB2aXNpYmxlIHdlIGNhbGwKKwkJLy8gdGhlIGdldFZhbHVlQXQgbWV0aG9kIG9uIHRoZSB0YWJsZSBtb2RlbCByYXRoZXIgdGhhbiBhdCB0aGUgSlRhYmxlCisJCVN0cmluZyBwYXNzd29yZCA9IChTdHJpbmcpIHBhc3N3b3Jkc1RhYmxlLmdldE1vZGVsKCkuZ2V0VmFsdWVBdChpUm93LDQpOyAvLyBjdXJyZW50IGVudHJ5J3MgcGFzc3dvcmQgdmFsdWUKKworCQkvLyBMZXQgdGhlIHVzZXIgdmlldyBzZXJ2aWNlIFVSTCwgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIG9mIHRoZSBlbnRyeQorCQlWaWV3VXNlcm5hbWVQYXNzd29yZEVudHJ5RGlhbG9nIHZpZXdTZXJ2aWNlUGFzc0RpYWxvZyA9IG5ldyBWaWV3VXNlcm5hbWVQYXNzd29yZEVudHJ5RGlhbG9nKAorCQkJCXRoaXMsIHNlcnZpY2VVUkwsIHVzZXJuYW1lLCBwYXNzd29yZCk7CisKKwkJdmlld1NlcnZpY2VQYXNzRGlhbG9nLnNldExvY2F0aW9uUmVsYXRpdmVUbyh0aGlzKTsKKwkJdmlld1NlcnZpY2VQYXNzRGlhbG9nLnNldFZpc2libGUodHJ1ZSk7CisJfQorCQorCS8qKgorCSAqIEluc2VydCBhIG5ldyB1c2VybmFtZS9wYXNzd29yZCBwYWlyIGZvciBhIHNlcnZpY2UgVVJMIGluIHRoZSBLZXlzdG9yZS4KKwkgKi8KKwlwcml2YXRlIHZvaWQgbmV3UGFzc3dvcmQoKSB7CisJCQorCQlTdHJpbmcgc2VydmljZVVSTCA9IG51bGw7IC8vIHNlcnZpY2UgVVJMCisJCVN0cmluZyB1c2VybmFtZSA9IG51bGw7IC8vIHVzZXJuYW1lCisJCVN0cmluZyBwYXNzd29yZCA9IG51bGw7IC8vIHBhc3N3b3JkCisKKwkJLy8gTG9vcCB1bnRpbCB0aGUgdXNlciBjYW5jZWxzIG9yIGVudGVycyBldmVyeXRoaW5nIGNvcnJlY3RseQorCQl3aGlsZSAodHJ1ZSkgeyAKKwkJCQorCQkJLy8gTGV0IHRoZSB1c2VyIGluc2VydCBhIG5ldyBwYXNzd29yZCBlbnRyeSAoYnkgc3BlY2lmeWluZyBzZXJ2aWNlCisJCQkvLyBVUkwsIHVzZXJuYW1lIGFuZCBwYXNzd29yZCkKKwkJCU5ld0VkaXRQYXNzd29yZEVudHJ5RGlhbG9nIG5ld1Bhc3N3b3JkRGlhbG9nID0gbmV3IE5ld0VkaXRQYXNzd29yZEVudHJ5RGlhbG9nKAorCQkJCQl0aGlzLCAiTmV3IHVzZXJuYW1lIGFuZCBwYXNzd29yZCBmb3IgYSBzZXJ2aWNlIiwgdHJ1ZSwgc2VydmljZVVSTCwgdXNlcm5hbWUsCisJCQkJCXBhc3N3b3JkKTsKKwkJCW5ld1Bhc3N3b3JkRGlhbG9nLnNldExvY2F0aW9uUmVsYXRpdmVUbyh0aGlzKTsKKwkJCW5ld1Bhc3N3b3JkRGlhbG9nLnNldFZpc2libGUodHJ1ZSk7CisKKwkJCXNlcnZpY2VVUkwgPSBuZXdQYXNzd29yZERpYWxvZy5nZXRTZXJ2aWNlVVJMKCk7IC8vIGdldCBzZXJ2aWNlIFVSTAorCQkJdXNlcm5hbWUgPSBuZXdQYXNzd29yZERpYWxvZy5nZXRVc2VybmFtZSgpOyAvLyBnZXQgdXNlcm5hbWUKKwkJCXBhc3N3b3JkID0gbmV3UGFzc3dvcmREaWFsb2cuZ2V0UGFzc3dvcmQoKTsgLy8gZ2V0IHBhc3N3b3JkCisKKwkJCWlmIChwYXNzd29yZCA9PSBudWxsKSB7IC8vIHVzZXIgY2FuY2VsbGVkIC0gYW55IG9mIHRoZSBhYm92ZSB0aHJlZSBmaWVsZHMgaXMgbnVsbCAJCQorCQkJCS8vIGRvIG5vdGhpbmcKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vIENoZWNrIGlmIGEgcGFzc3dvcmQgZW50cnkgd2l0aCB0aGUgZ2l2ZW4gc2VydmljZSBVUkwKKwkJCS8vIGFscmVhZHkgZXhpc3RzIGluIHRoZSBLZXlzdG9yZS4KKwkJCS8vIFdlIGFzayB0aGlzIGhlcmUgYXMgdGhlIHVzZXIgbWF5IHdpc2ggdG8gb3ZlcndyaXRlIHRoZQorCQkJLy8gZXhpc3RpbmcgcGFzc3dvcmQgZW50cnkuCisJCQkvLyBDaGVja2luZyBmb3Iga2V5IHBhaXIgZW50cmllcycgVVJMcyBpcyBkb25lIGluIHRoZQorCQkJLy8gTmV3RWRpdFBhc3N3b3JkRW50cnkgZGlhbG9nLgorCQkJCisJCQkvLyBHZXQgbGlzdCBvZiBzZXJ2aWNlIFVSTHMgZm9yIGFsbCB0aGUgcGFzc3dvcmQgZW50cmllcyBpbiB0aGUgS2V5c3RvcmUKKwkJCUFycmF5TGlzdDxTdHJpbmc+IHNlcnZpY2VVUkxzID0gbnVsbDsKKwkJCXRyeXsKKwkJCQlzZXJ2aWNlVVJMcyA9IGNyZWRNYW5hZ2VyLmdldFNlcnZpY2VVUkxzZm9yVXNlcm5hbWVBbmRQYXNzd29yZHMoKTsgCisJCQl9CisJCQljYXRjaChDTUV4Y2VwdGlvbiAgY21lKXsKKwkJCQlTdHJpbmcgZXhNZXNzYWdlID0gIkZhaWxlZCB0byBnZXQgc2VydmljZSBVUkxzIGZvciBhbGwgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIHBhaXJzIHRvIGNoZWNrIGlmIHRoZSBlbnRlcmVkIHNlcnZpY2UgVVJMIGFscmVhZHkgZXhpc3RzIjsKKwkJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyh0aGlzLCBleE1lc3NhZ2UsCisJCQkJCQkiQ3JlZGVudGlhbCBNYW5hZ2VyIEVycm9yIiwKKwkJCQkJCUpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmIChzZXJ2aWNlVVJMcy5jb250YWlucyhzZXJ2aWNlVVJMKSkgeyAvLyBpZiBzdWNoIGEgVVJMIGFscmVhZHkgZXhpc3RzIAorCQkJCS8vIEFzayBpZiB0aGUgdXNlciB3YW50cyB0byBvdmVyd3JpdGUgaXQKKwkJCQlpbnQgaVNlbGVjdGVkID0gSk9wdGlvblBhbmUuc2hvd0NvbmZpcm1EaWFsb2codGhpcywKKwkJCQkJCSJUaGUgS2V5c3RvcmUgYWxyZWFkeSBjb250YWlucyBhIHBhc3N3b3JkIGVudHJ5IHdpdGggdGhlIHNhbWUgc2VydmljZSBVUkwuXG4iCisJCQkJCQkJCSsgIkRvIHlvdSB3YW50IHRvIG92ZXJ3cml0ZSBpdD8iLAorCQkJCQkJIkNyZWRlbnRpYWwgTWFuYWdlciBBbGVydCIsCisJCQkJCQlKT3B0aW9uUGFuZS5ZRVNfTk9fT1BUSU9OKTsKKworCQkJCS8vIEFkZCB0aGUgbmV3IHBhc3N3b3JkIGVudHJ5IGluIHRoZSBLZXlzdG9yZSAKKwkJCQlpZiAoaVNlbGVjdGVkID09IEpPcHRpb25QYW5lLllFU19PUFRJT04pIHsKKwkJCQkJdHJ5eworCQkJCQkJY3JlZE1hbmFnZXIuc2F2ZVVzZXJuYW1lQW5kUGFzc3dvcmRGb3JTZXJ2aWNlKHVzZXJuYW1lLCBwYXNzd29yZCwgc2VydmljZVVSTCk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQljYXRjaCAoQ01FeGNlcHRpb24gY21lKXsKKwkJCQkJCVN0cmluZyBleE1lc3NhZ2UgPSAiRmFpbGVkIHRvIGluc2VydCBhIG5ldyB1c2VybmFtZSBhbmQgcGFzc3dvcmQgcGFpciBpbiB0aGUgS2V5c3RvcmUiOworCQkJCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcywgZXhNZXNzYWdlLAorCQkJCQkJCQkiQ3JlZGVudGlhbCBNYW5hZ2VyIEVycm9yIiwKKwkJCQkJCQkJSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7CisJCQkJCX0KKwkJCQl9CisJCQkvLyBPdGhlcndpc2Ugc2hvdyB0aGUgc2FtZSB3aW5kb3cgd2l0aCB0aGUgZW50ZXJlZCBzZXJ2aWNlCisJCQkvLyBVUkwsIHVzZXJuYW1lIGFuZCBwYXNzd29yZCB2YWx1ZXMKKwkJCX0gCisJCQllbHNlIHsKKwkJCQkvLyBBZGQgdGhlIG5ldyBwYXNzd29yZCBlbnRyeSBpbiB0aGUgS2V5c3RvcmUKKwkJCQl0cnl7CisJCQkJCWNyZWRNYW5hZ2VyLnNhdmVVc2VybmFtZUFuZFBhc3N3b3JkRm9yU2VydmljZSh1c2VybmFtZSwgcGFzc3dvcmQsIHNlcnZpY2VVUkwpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2F0Y2ggKENNRXhjZXB0aW9uIGNtZSl7CisJCQkJCVN0cmluZyBleE1lc3NhZ2UgPSAiRmFpbGVkIHRvIGluc2VydCBhIG5ldyB1c2VybmFtZSBhbmQgcGFzc3dvcmQgcGFpciBpbiB0aGUgS2V5c3RvcmUiOworCQkJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyh0aGlzLCBleE1lc3NhZ2UsCisJCQkJCQkJIkNyZWRlbnRpYWwgTWFuYWdlciBFcnJvciIsCisJCQkJCQkJSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7CisJCQkJfQorCQkJfQorCQl9IAorCX0KKwkKKworCS8qKgorCSAqIEVkaXQgYSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgZW50cnkgb3IgdGhlaXIgcmVsYXRlZCBzZXJ2aWNlIFVSTCBpbiB0aGUgS2V5c3RvcmUuCisJICovCisJcHJpdmF0ZSB2b2lkIGVkaXRQYXNzd29yZCgpIHsKKworCQkvLyBXaGljaCBwYXNzd29yZCBlbnRyeSBoYXMgYmVlbiBzZWxlY3RlZD8KKwkJaW50IGlSb3cgPSBwYXNzd29yZHNUYWJsZS5nZXRTZWxlY3RlZFJvdygpOworCQlpZiAoaVJvdyA9PSAtMSkgeyAvLyBubyByb3cgY3VycmVudGx5IHNlbGVjdGVkCisJCQlyZXR1cm47CisJCX0KKworCQkvLyBHZXQgY3VycmVudCB2YWx1ZXMgZm9yIHNlcnZpY2UgVVJMLCB1c2VybmFtZSBhbmQgcGFzc3dvcmQKKwkJU3RyaW5nIHNlcnZpY2VVUkwgPSAoU3RyaW5nKSBwYXNzd29yZHNUYWJsZS5nZXRWYWx1ZUF0KGlSb3csIDEpOyAvLyBjdXJyZW50IGVudHJ5J3Mgc2VydmljZSBVUkwKKworCQlTdHJpbmcgdXNlcm5hbWUgPSAoU3RyaW5nKSBwYXNzd29yZHNUYWJsZS5nZXRWYWx1ZUF0KGlSb3csIDIpOyAvLyBjdXJyZW50IGVudHJ5J3MgdXNlcm5hbWUKKworCQkvLyBCZWNhdXNlIHRoZSBwYXNzd29yZCBjb2x1bW4gaXMgbm90IHZpc2libGUgd2UgY2FsbAorCQkvLyB0aGUgZ2V0VmFsdWVBdCBtZXRob2Qgb24gdGhlIHRhYmxlIG1vZGVsIHJhdGhlciB0aGFuIGF0IHRoZSBKVGFibGUKKwkJU3RyaW5nIHBhc3N3b3JkID0gKFN0cmluZykgcGFzc3dvcmRzVGFibGUuZ2V0TW9kZWwoKS5nZXRWYWx1ZUF0KGlSb3csIDQpOyAvLyBjdXJyZW50IGVudHJ5J3MgcGFzc3dvcmQgdmFsdWUKKworCQl3aGlsZSAodHJ1ZSkgeyAvLyBsb29wIHVudGlsIHVzZXIgY2FuY2VscyBvciBlbnRlcnMgZXZlcnl0aGluZyBjb3JyZWN0bHkKKwkJCS8vIExldCB0aGUgdXNlciBlZGl0IHNlcnZpY2UgVVJMLCB1c2VybmFtZSBvciBwYXNzd29yZCBvZiBhIHBhc3N3b3JkIGVudHJ5CisJCQlOZXdFZGl0UGFzc3dvcmRFbnRyeURpYWxvZyBlZGl0UGFzc3dvcmREaWFsb2cgPSBuZXcgTmV3RWRpdFBhc3N3b3JkRW50cnlEaWFsb2coCisJCQkJCXRoaXMsICJFZGl0IHVzZXJuYW1lIGFuZCBwYXNzd29yZCBmb3IgYSBzZXJ2aWNlIiwgdHJ1ZSwgc2VydmljZVVSTCwgdXNlcm5hbWUsCisJCQkJCXBhc3N3b3JkKTsKKworCQkJZWRpdFBhc3N3b3JkRGlhbG9nLnNldExvY2F0aW9uUmVsYXRpdmVUbyh0aGlzKTsKKwkJCWVkaXRQYXNzd29yZERpYWxvZy5zZXRWaXNpYmxlKHRydWUpOworCisJCQkvLyBOZXcgdmFsdWVzCisJCQlTdHJpbmcgblNlcnZpY2VVUkwgPSBlZGl0UGFzc3dvcmREaWFsb2cuZ2V0U2VydmljZVVSTCgpOyAvLyBnZXQgbmV3IHNlcnZpY2UgVVJMCisJCQlTdHJpbmcgblVzZXJuYW1lID0gZWRpdFBhc3N3b3JkRGlhbG9nLmdldFVzZXJuYW1lKCk7IC8vIGdldCBuZXcgdXNlcm5hbWUKKwkJCVN0cmluZyBuUGFzc3dvcmQgPSBlZGl0UGFzc3dvcmREaWFsb2cuZ2V0UGFzc3dvcmQoKTsgLy8gZ2V0IG5ldyBwYXNzd29yZAorCisJCQlpZiAoblBhc3N3b3JkID09IG51bGwpIHsgLy8gdXNlciBjYW5jZWxsZWQgLSBhbnkgb2YgdGhlIGFib3ZlIHRocmVlIGZpZWxkcyBpcyBudWxsCisJCQkJLy8gZG8gbm90aGluZworCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gSXMgYW55dGhpbmcgYWN0dWFsbHkgbW9kaWZpZWQ/CisJCQlib29sZWFuIGlzTW9kaWZpZWQgPSAoIXNlcnZpY2VVUkwuZXF1YWxzKG5TZXJ2aWNlVVJMKQorCQkJCQl8fCAhdXNlcm5hbWUuZXF1YWxzKG5Vc2VybmFtZSkgfHwgIXBhc3N3b3JkCisJCQkJCS5lcXVhbHMoblBhc3N3b3JkKSk7CisKKwkJCWlmIChpc01vZGlmaWVkKSB7CisJCQkJLy8gQ2hlY2sgaWYgYSBkaWZmZXJlbnQgcGFzc3dvcmQgZW50cnkgd2l0aCB0aGUgbmV3IFVSTAorCQkJCS8vIChpLmUuIGFsaWFzKSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgS2V5c3RvcmUKKwkJCQkvLyBXZSBhc2sgdGhpcyBoZXJlIGFzIHRoZSB1c2VyIG1heSB3aXNoIHRvIG92ZXJ3cml0ZSB0aGF0CisJCQkJLy8gb3RoZXIgcGFzc3dvcmQgZW50cnkuCisJCQkJCisJCQkJLy8gR2V0IGxpc3Qgb2YgVVJMcyBmb3IgYWxsIHBhc3N3b3JkcyBpbiB0aGUgS2V5c3RvcmUKKwkJCQlBcnJheUxpc3Q8U3RyaW5nPiBzZXJ2aWNlVVJMcyA9IG51bGw7CisJCQkJdHJ5eworCQkJCQlzZXJ2aWNlVVJMcyA9IGNyZWRNYW5hZ2VyLmdldFNlcnZpY2VVUkxzZm9yVXNlcm5hbWVBbmRQYXNzd29yZHMoKTsgCisJCQkJfQorCQkJCWNhdGNoKENNRXhjZXB0aW9uICBjbWUpeworCQkJCQlTdHJpbmcgZXhNZXNzYWdlID0gIkZhaWxlZCB0byBnZXQgc2VydmljZSBVUkxzIGZvciBhbGwgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIHBhaXJzIHRvIGNoZWNrIGlmIHRoZSBtb2RpZmllZCBlbnRyeSBhbHJlYWR5IGV4aXN0cyI7CisJCQkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsIGV4TWVzc2FnZSwKKwkJCQkJCQkiQ3JlZGVudGlhbCBNYW5hZ2VyIEVycm9yIiwKKwkJCQkJCQlKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQorCQkJCS8vIElmIHRoZSBtb2RpZmllZCBzZXJ2aWNlIFVSTCBhbHJlYWR5IGV4aXN0cyBhbmQgaXMgbm90IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgb25lCisJCQkJaWYgKCAoIW5TZXJ2aWNlVVJMLmVxdWFscyhzZXJ2aWNlVVJMKSkgJiYgc2VydmljZVVSTHMuY29udGFpbnMoblNlcnZpY2VVUkwpKSB7IAorCisJCQkJCWludCBpU2VsZWN0ZWQgPSBKT3B0aW9uUGFuZS5zaG93Q29uZmlybURpYWxvZyh0aGlzLAorCQkJCQkJCSJUaGUgS2V5c3RvcmUgYWxyZWFkeSBjb250YWlucyB1c2VybmFtZSBhbmQgcGFzc3dvcmQgcGFpciBmb3IgdGhlIGVudGVyZWQgc2VydmljZSBVUkwuXG4iCisJCQkJCQkJCQkrICJEbyB5b3Ugd2FudCB0byBvdmVyd3JpdGUgaXQ/IiwKKwkJCQkJCQkiQ3JlZGVudGlhbCBNYW5hZ2VyIEFsZXJ0IiwKKwkJCQkJCQlKT3B0aW9uUGFuZS5ZRVNfTk9fT1BUSU9OKTsKKworCQkJCQlpZiAoaVNlbGVjdGVkID09IEpPcHRpb25QYW5lLllFU19PUFRJT04pIHsKKworCQkJCQkJLy8gT3ZlcndyaXRlIHRoYXQgb3RoZXIgZW50cnkgZW50cnkgYW5kIHNhdmUgdGhlIG5ldworCQkJCQkJLy8gb25lIGluIGl0cyBwbGFjZS4KKwkJCQkJCS8vIEFsc28gcmVtb3ZlIHRoZSBjdXJyZW50IG9uZSB0aGF0IHdlIGFyZSBlZGl0aW5nIC0KKwkJCQkJCS8vIGFzIGl0IGlzIHJlcGxhY2luZyB0aGUgb3RoZXIgZW50cnkuCisJCQkJCQl0cnl7CisJCQkJCQkJY3JlZE1hbmFnZXIuZGVsZXRlVXNlcm5hbWVBbmRQYXNzd29yZEZvclNlcnZpY2Uoc2VydmljZVVSTCk7CisJCQkJCQkJY3JlZE1hbmFnZXIuc2F2ZVVzZXJuYW1lQW5kUGFzc3dvcmRGb3JTZXJ2aWNlKG5Vc2VybmFtZSwgblBhc3N3b3JkLCBuU2VydmljZVVSTCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQljYXRjaCAoQ01FeGNlcHRpb24gY21lKXsKKwkJCQkJCQlTdHJpbmcgZXhNZXNzYWdlID0gIkZhaWxlZCB0byB1cGRhdGUgdGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBwYWlyIGluIHRoZSBLZXlzdG9yZSI7CisJCQkJCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcywgZXhNZXNzYWdlLAorCQkJCQkJCQkJIkNyZWRlbnRpYWwgTWFuYWdlciBFcnJvciIsCisJCQkJCQkJCQlKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCS8vIE90aGVyd2lzZSBzaG93IHRoZSBzYW1lIHdpbmRvdyB3aXRoIHRoZSBlbnRlcmVkCisJCQkJLy8gc2VydmljZSBVUkwsIHVzZXJuYW1lIGFuZCBwYXNzd29yZCB2YWx1ZXMKKwkJCQl9IAorCQkJCWVsc2UgeworCQkJCQl0cnl7CisJCQkJCQlpZiAoICFuU2VydmljZVVSTC5lcXVhbHMoc2VydmljZVVSTCkpIHsKKwkJCQkJCQljcmVkTWFuYWdlci5kZWxldGVVc2VybmFtZUFuZFBhc3N3b3JkRm9yU2VydmljZShzZXJ2aWNlVVJMKTsKKwkJCQkJCX0KKwkJCQkJCWNyZWRNYW5hZ2VyLnNhdmVVc2VybmFtZUFuZFBhc3N3b3JkRm9yU2VydmljZShuVXNlcm5hbWUsIG5QYXNzd29yZCwgblNlcnZpY2VVUkwpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJY2F0Y2ggKENNRXhjZXB0aW9uIGNtZSl7CisJCQkJCQlTdHJpbmcgZXhNZXNzYWdlID0gIkZhaWxlZCB0byB1cGRhdGUgdGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBwYWlyIGluIHRoZSBLZXlzdG9yZSI7CisJCQkJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyh0aGlzLCBleE1lc3NhZ2UsCisJCQkJCQkJCSJDcmVkZW50aWFsIE1hbmFnZXIgRXJyb3IiLAorCQkJCQkJCQlKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2V7IC8vIG5vdGhpbmcgYWN0dWFsbHkgbW9kaWZpZWQgYnkgT0sgcHJlc3NlZAorCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogRGVsZXRlIHRoZSBzZWxlY3RlZCB1c2VybmFtZSBhbmQgcGFzc3dvcmQgZW50cmllcyBmcm9tIHRoZSBLZXlzdG9yZS4KKwkgKi8KKwlwcml2YXRlIHZvaWQgZGVsZXRlUGFzc3dvcmQoKSB7CisKKwkJLy8gV2hpY2ggZW50cmllcyBoYXZlIGJlZW4gc2VsZWN0ZWQ/CisJCWludFtdIGlSb3dzID0gcGFzc3dvcmRzVGFibGUuZ2V0U2VsZWN0ZWRSb3dzKCk7CisJCWlmIChpUm93cy5sZW5ndGggPT0gMCkgeyAvLyBubyBwYXNzd29yZCBlbnRyeSBzZWxlY3RlZAorCQkJcmV0dXJuOworCQl9CisKKwkJLy8gQXNrIHVzZXIgdG8gY29uZmlybSB0aGUgZGVsZXRpb24KKwkJaW50IGlTZWxlY3RlZCA9IEpPcHRpb25QYW5lCisJCQkJLnNob3dDb25maXJtRGlhbG9nKAorCQkJCQkJbnVsbCwKKwkJCQkJCSJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoZSBzZWxlY3RlZCB1c2VybmFtZSBhbmQgcGFzc3dvcmQgZW50cmllcz8iLAorCQkJCQkJIkNyZWRlbnRpYWwgTWFuYWdlciBBbGVydCIsCisJCQkJCQlKT3B0aW9uUGFuZS5ZRVNfTk9fT1BUSU9OKTsKKworCQlpZiAoaVNlbGVjdGVkICE9IEpPcHRpb25QYW5lLllFU19PUFRJT04pIHsKKwkJCXJldHVybjsKKwkJfQorCQkJCQkKKwkJZm9yIChpbnQgaSA9IGlSb3dzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7IC8vIGRlbGV0ZSBmcm9tIGJhY2t3YXJkcworCQkJLy8gR2V0IHNlcnZpY2UgVVJMIGZvciB0aGUgY3VycmVudCBlbnRyeSAKKwkJCVN0cmluZyBzZXJ2aWNlVVJMID0gKFN0cmluZykgcGFzc3dvcmRzVGFibGUuZ2V0VmFsdWVBdChpUm93c1tpXSwgMSk7IC8vIGN1cnJlbnQgZW50cnkncyBzZXJ2aWNlIFVSTAorCQkJdHJ5IHsKKwkJCQkvLyBEZWxldGUgdGhlIHBhc3N3b3JkIGVudHJ5IGZyb20gdGhlIEtleXN0b3JlCisJCQkJY3JlZE1hbmFnZXIuZGVsZXRlVXNlcm5hbWVBbmRQYXNzd29yZEZvclNlcnZpY2Uoc2VydmljZVVSTCk7CisJCQl9IAorCQkJY2F0Y2ggKENNRXhjZXB0aW9uIGNtZSkgeworCQkJCVN0cmluZyBleE1lc3NhZ2UgPSAiRmFpbGVkIHRvIGRlbGV0ZSB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIHBhaXIgZnJvbSB0aGUgS2V5c3RvcmUiOworCQkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsIGV4TWVzc2FnZSwKKwkJCQkJCSJDcmVkZW50aWFsIE1hbmFnZXIgRXJyb3IiLAorCQkJCQkJSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7CisJCQl9IAorCQl9CQkKKwl9CisJCisJLyoqCisJICogU2hvdyB0aGUgY29udGVudHMgb2YgYSAodXNlciBvciB0cnVzdGVkKSBjZXJ0aWZpY2F0ZS4KKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwcml2YXRlIHZvaWQgdmlld0NlcnRpZmljYXRlKCkgeworCisJCWludCBpUm93ID0gLTE7CisJCVN0cmluZyBhbGlhcyA9IG51bGw7CisJCVg1MDlDZXJ0aWZpY2F0ZSBjZXJ0VG9WaWV3ID0gbnVsbDsKKwkJQXJyYXlMaXN0PFN0cmluZz4gc2VydmljZVVSTHMgPSBudWxsOworCQlTdHJpbmcga2V5c3RvcmVUeXBlID0gbnVsbDsKKwkJCisJCS8vIEFyZSB3ZSBzaG93aW5nIHVzZXIncyBwdWJsaWMga2V5IGNlcnRpZmljYXRlPworCQlpZiAoa2V5UGFpcnNUYWIuaXNTaG93aW5nKCkpeworCQkJa2V5c3RvcmVUeXBlID0gQ3JlZGVudGlhbE1hbmFnZXIuS0VZU1RPUkU7CisJCQlpUm93ID0ga2V5UGFpcnNUYWJsZS5nZXRTZWxlY3RlZFJvdygpOworCQkJCisJCQlpZiAoaVJvdyAhPSAtIDEpeworCQkJCS8vIEJlY2F1c2UgdGhlIGFsaWFzIGNvbHVtbiBpcyBub3QgdmlzaWJsZSB3ZSBjYWxsIHRoZQorCQkJCS8vIGdldFZhbHVlQXQgbWV0aG9kIG9uIHRoZSB0YWJsZSBtb2RlbCByYXRoZXIgdGhhbiBhdCB0aGUgSlRhYmxlCisJCQkJYWxpYXMgPSAoU3RyaW5nKSBrZXlQYWlyc1RhYmxlLmdldE1vZGVsKCkuZ2V0VmFsdWVBdChpUm93LCA2KTsgLy8gY3VycmVudCBlbnRyeSdzIEtleXN0b3JlIGFsaWFzCisKKwkJICAgIAkvLyBHZXQgdGhlIGxpc3Qgb2Ygc2VydmljZSBVUkxzIGZvciB0aGUgZW50cnkKKwkJICAgICAgICBzZXJ2aWNlVVJMcyA9IChBcnJheUxpc3Q8U3RyaW5nPikga2V5UGFpcnNUYWJsZS5nZXRNb2RlbCgpLmdldFZhbHVlQXQoaVJvdywgNSk7ICAgCisJCQl9CisJCX0KKwkJLy8gQXJlIHdlIHNob3dpbmcgdHJ1c3RlZCBjZXJ0aWZpY2F0ZT8KKwkJZWxzZSBpZih0cnVzdGVkQ2VydGlmaWNhdGVzVGFiLmlzU2hvd2luZygpKXsKKwkJCWtleXN0b3JlVHlwZSA9IENyZWRlbnRpYWxNYW5hZ2VyLlRSVVNUU1RPUkU7CisJCQlpUm93ID0gdHJ1c3RlZENlcnRzVGFibGUuZ2V0U2VsZWN0ZWRSb3coKTsKKwkJCQorCQkJaWYgKGlSb3cgIT0gLSAxKXsKKworCQkJCS8vIEdldCB0aGUgc2VsZWN0ZWQgdHJ1c3RlZCBjZXJ0aWZpY2F0ZSBlbnRyeSdzIFRydXN0c3RvcmUgYWxpYXMKKwkJCQkvLyBBbGlhcyBjb2x1bW4gaXMgaW52aXNpYmxlIHNvIHdlIGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgdGFibGUgbW9kZWwKKwkJCQlhbGlhcyA9IChTdHJpbmcpIHRydXN0ZWRDZXJ0c1RhYmxlLmdldE1vZGVsKCkKKwkJCQkJCS5nZXRWYWx1ZUF0KGlSb3csIDUpOyAKKwkJCX0KKwkJfQorCQkKKwkJaWYgKGlSb3cgIT0gLTEpIHsgLy8gc29tZXRoaW5nIGhhcyBiZWVuIHNlbGVjdGVkCisJCQl0cnkgeworCQkJCS8vIEdldCB0aGUgZW50cnkncyBjZXJ0aWZpY2F0ZQorCQkJCWNlcnRUb1ZpZXcgPSBDTVg1MDlVdGlsLmNvbnZlcnRDZXJ0aWZpY2F0ZShjcmVkTWFuYWdlcgorCQkJCQkJLmdldENlcnRpZmljYXRlKGtleXN0b3JlVHlwZSwgYWxpYXMpKTsKKworCQkJCS8vIFN1cHBseSB0aGUgY2VydGlmaWNhdGUgYW5kIGxpc3Qgb2YgVVJMcyB0byB0aGUgdmlldworCQkJCS8vIGNlcnRpZmljYXRlIGRpYWxvZy4gCisJCQkJVmlld0NlcnREZXRhaWxzRGlhbG9nIHZpZXdDZXJ0RGV0YWlsc0RpYWxvZyA9IG5ldyBWaWV3Q2VydERldGFpbHNEaWFsb2coCisJCQkJCQl0aGlzLCAiQ2VydGlmaWNhdGUgZGV0YWlscyIsIHRydWUsIGNlcnRUb1ZpZXcsCisJCQkJCQlzZXJ2aWNlVVJMcyk7CisJCQkJdmlld0NlcnREZXRhaWxzRGlhbG9nLnNldExvY2F0aW9uUmVsYXRpdmVUbyh0aGlzKTsKKwkJCQl2aWV3Q2VydERldGFpbHNEaWFsb2cuc2V0VmlzaWJsZSh0cnVlKTsKKwkJCX0gCisJCQljYXRjaCAoQ01FeGNlcHRpb24gY21lKSB7CisJCQkJU3RyaW5nIGV4TWVzc2FnZSA9ICJGYWlsZWQgdG8gZ2V0IGNlcnRpZmljYXRlIGRldGFpbHMgdG8gZGlzcGxheSB0byB0aGUgdXNlciI7CisJCQkJbG9nZ2VyLmVycm9yKGV4TWVzc2FnZSk7CisJCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcywgZXhNZXNzYWdlLAorCQkJCQkJIkNyZWRlbnRpYWwgTWFuYWdlciBFcnJvciIsIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOworCQkJfSAKKwkJfSAKKwl9CisJCisJLyoqCisJICogSW1wb3J0IGEga2V5IHBhaXIgZnJvbSBhIFBLQ1MgIzEyIGtleXN0b3JlIGZpbGUgdG8gdGhlIEtleXN0b3JlLgorCSAqLworCXByaXZhdGUgdm9pZCBuZXdLZXlQYWlyKCkgeworCisJCS8vIExldCB0aGUgdXNlciBjaG9vc2UgYSBQS0NTICMxMiBmaWxlIChrZXlzdG9yZSkgY29udGFpbmluZyBhIHB1YmxpYworCQkvLyBhbmQgcHJpdmF0ZSBrZXkgcGFpciB0byBpbXBvcnQKKwkJRmlsZSBpbXBvcnRGaWxlID0gc2VsZWN0SW1wb3J0RXhwb3J0RmlsZSgKKwkJCQkiUEtDUyAjMTIgZmlsZSB0byBpbXBvcnQgZnJvbSIsIC8vIHRpdGxlCisJCQkJbmV3IFN0cmluZ1tdIHsgIi5wMTIiLCAiLnBmeCIgfSwgLy8gYXJyYXkgb2YgZmlsZSBleHRlbnNpb25zCisJCQkJLy8gZm9yIHRoZSBmaWxlIGZpbHRlcgorCQkJCSJQS0NTIzEyIEZpbGVzICgqLnAxMiwgKi5wZngpIiwgLy8gZGVzY3JpcHRpb24gb2YgdGhlIGZpbHRlcgorCQkJCSJJbXBvcnQiKTsgLy8gdGV4dCBmb3IgdGhlIGZpbGUgY2hvb3NlcidzIGFwcHJvdmUgYnV0dG9uCisKKwkJaWYgKGltcG9ydEZpbGUgPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gVGhlIFBLQ1MgIzEyIGtleXN0b3JlIGlzIG5vdCBhIGZpbGUKKwkJaWYgKCFpbXBvcnRGaWxlLmlzRmlsZSgpKSB7CisJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyh0aGlzLCAiWW91ciBzZWxlY3Rpb24gaXMgbm90IGEgZmlsZSIsCisJCQkJCSJDcmVkZW50aWFsIE1hbmFnZXIgQWxlcnQiLCBKT3B0aW9uUGFuZS5XQVJOSU5HX01FU1NBR0UpOworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gR2V0IHRoZSB1c2VyIHRvIGVudGVyIHRoZSBwYXNzd29yZCB0aGF0IHdhcyB1c2VkIHRvIGVuY3J5cHQgdGhlCisJCS8vIHByaXZhdGUga2V5IGNvbnRhaW5lZCBpbiB0aGUgUEtDUyAjMTIgZmlsZQorCQlHZXRQYXNzd29yZERpYWxvZyBkR2V0UGFzc3dvcmQgPSBuZXcgR2V0UGFzc3dvcmREaWFsb2codGhpcywKKwkJCQkiSW1wb3J0IGtleSBwYWlyIGVudHJ5IiwgdHJ1ZSwKKwkJCQkiRW50ZXIgdGhlIHBhc3N3b3JkIHRoYXQgd2FzIHVzZWQgdG8gZW5jcnlwdCB0aGUgUEtDUyAjMTIgZmlsZSIpOworCQlkR2V0UGFzc3dvcmQuc2V0TG9jYXRpb25SZWxhdGl2ZVRvKHRoaXMpOworCQlkR2V0UGFzc3dvcmQuc2V0VmlzaWJsZSh0cnVlKTsKKworCQlTdHJpbmcgcGtjczEyUGFzc3dvcmQgPSBkR2V0UGFzc3dvcmQuZ2V0UGFzc3dvcmQoKTsKKworCQlpZiAocGtjczEyUGFzc3dvcmQgPT0gbnVsbCkgeyAvLyB1c2VyIGNhbmNlbGxlZAorCQkJcmV0dXJuOworCQl9IGVsc2UgaWYgKHBrY3MxMlBhc3N3b3JkLmxlbmd0aCgpID09IDApIHsgLy8gZW1wdHkgcGFzc3dvcmQKKwkJCS8vIEZJWE1FOiBNYXliZSB1c2VyIGRpZCBub3QgaGF2ZSB0aGUgcGFzc3dvcmQgc2V0IGZvciB0aGUgcHJpdmF0ZSBrZXk/Pz8KKwkJCXJldHVybjsKKwkJfQorCisJCXRyeSB7CisJCQkvLyBMb2FkIHRoZSBQS0NTICMxMiBrZXlzdG9yZSBmcm9tIHRoZSBmaWxlIHVzaW5nIEJDIHByb3ZpZGVyCisJCQlLZXlTdG9yZSBwa2NzMTIgPSBjcmVkTWFuYWdlci5sb2FkUEtDUzEyS2V5c3RvcmUoaW1wb3J0RmlsZSwgcGtjczEyUGFzc3dvcmQpOworCisJCQkvLyBEaXNwbGF5IHRoZSBpbXBvcnQga2V5IHBhaXIgZGlhbG9nIHN1cHBseWluZyBhbGwgdGhlIHByaXZhdGUga2V5cworCQkJLy8gc3RvcmVkIGluIHRoZSBQS0NTICMxMiBmaWxlCisJCQkvLyBhbmQgYSBmaWVsZCBmb3IgdGhlIHVzZXIgdG8gZW50ZXIgc2VydmljZSBVUkwgYXNzb2NpYXRlZCB3aXRoIHRoZQorCQkJLy8gc2VsZWN0ZWQga2V5IHBhaXIKKwkJCS8vIFR5cGljYWxseSB0aGVyZSB3aWxsIGJlIG9ubHkgb25lIHByaXZhdGUga2V5IGluc2lkZSwgYnV0IGNvdWxkIGJlCisJCQkvLyBtb3JlCisJCQlOZXdLZXlQYWlyRW50cnlEaWFsb2cgZEltcG9ydEtleVBhaXIgPSBuZXcgTmV3S2V5UGFpckVudHJ5RGlhbG9nKAorCQkJCQl0aGlzLCAiQ3JlZGVudGlhbCBNYW5hZ2VyIiwgdHJ1ZSwgcGtjczEyKTsKKwkJCWRJbXBvcnRLZXlQYWlyLnNldExvY2F0aW9uUmVsYXRpdmVUbyh0aGlzKTsKKwkJCWRJbXBvcnRLZXlQYWlyLnNldFZpc2libGUodHJ1ZSk7CisKKwkJCS8vIEdldCB0aGUgcHJpdmF0ZSBrZXkgYW5kIGNlcnRpZmljYXRlIGNoYWluIG9mIHRoZSBrZXkgcGFpcgorCQkJS2V5IHByaXZhdGVLZXkgPSBkSW1wb3J0S2V5UGFpci5nZXRQcml2YXRlS2V5KCk7CisJCQlDZXJ0aWZpY2F0ZVtdIGNlcnRDaGFpbiA9IGRJbXBvcnRLZXlQYWlyLmdldENlcnRpZmljYXRlQ2hhaW4oKTsKKworCQkJLy8gR2V0IHRoZSBzZXJ2aWNlIFVSTHMKKwkJCUFycmF5TGlzdDxTdHJpbmc+IHNlcnZpY2VVUkxzID0gZEltcG9ydEtleVBhaXIuZ2V0U2VydmljZVVSTHMoKTsKKworCQkJaWYgKHByaXZhdGVLZXkgPT0gbnVsbCB8fCBjZXJ0Q2hhaW4gPT0gbnVsbCkgeworCQkJCS8vIFVzZXIgZGlkIG5vdCBzZWxlY3QgYSBrZXkgcGFpciBmb3IgaW1wb3J0IG9yIGNhbmNlbGxlZAorCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gQ2hlY2sgaWYgYSBrZXkgcGFpciBlbnRyeSB3aXRoIHRoZSBzYW1lIGFsaWFzIGFscmVhZHkgZXhpc3RzIGluCisJCQkvLyB0aGUgS2V5c3RvcmUKKwkJCWlmIChjcmVkTWFuYWdlci5jb250YWluc0tleVBhaXIocHJpdmF0ZUtleSwgY2VydENoYWluKSkgeworCQkJCWludCBpU2VsZWN0ZWQgPSBKT3B0aW9uUGFuZQorCQkJCQkJLnNob3dDb25maXJtRGlhbG9nKAorCQkJCQkJCQl0aGlzLAorCQkJCQkJCQkiVGhlIGtleXN0b3JlIGFscmVhZHkgY29udGFpbnMgdGhlIGtleSBwYWlyIGVudHJ5IHdpdGggdGhlIHNhbWUgcHJpdmF0ZSBrZXkuXG5EbyB5b3Ugd2FudCB0byBvdmVyd3JpdGUgaXQ/IiwKKwkJCQkJCQkJIkNyZWRlbnRpYWwgTWFuYWdlciBBbGVydCIsCisJCQkJCQkJCUpPcHRpb25QYW5lLllFU19OT19PUFRJT04pOworCisJCQkJaWYgKGlTZWxlY3RlZCAhPSBKT3B0aW9uUGFuZS5ZRVNfT1BUSU9OKSB7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisKKwkJCS8vIFBsYWNlIHRoZSBwcml2YXRlIGtleSBhbmQgY2VydGlmaWNhdGUgY2hhaW4gaW50byB0aGUgS2V5c3RvcmUKKwkJCS8vIGFuZCBzYXZlIHRoZSBzZXJ2aWNlIFVSTHMgbGlzdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBrZXkgcGFpcgorCQkJY3JlZE1hbmFnZXIuc2F2ZUtleVBhaXIocHJpdmF0ZUtleSwgY2VydENoYWluLCBzZXJ2aWNlVVJMcyk7CisKKwkJCS8vIERpc3BsYXkgc3VjY2VzcyBtZXNzYWdlCisJCQlKT3B0aW9uUGFuZQorCQkJCQkuc2hvd01lc3NhZ2VEaWFsb2codGhpcywgIktleSBwYWlyIGltcG9ydCBzdWNjZXNzZnVsIiwKKwkJCQkJCQkiQ3JlZGVudGlhbCBNYW5hZ2VyIEFsZXJ0IiwKKwkJCQkJCQlKT3B0aW9uUGFuZS5JTkZPUk1BVElPTl9NRVNTQUdFKTsKKwkJfSAKKwkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeyAvLyB0b28gbWFueSBleGNlcHRpb25zIHRvIGNhdGNoIHNlcGFyYXRlbHkKKwkJCVN0cmluZyBleE1lc3NhZ2UgPSAiRmFpbGVkIHRvIGltcG9ydCB0aGUga2V5IHBhaXIgZW50cnkgdG8gdGhlIEtleXN0b3JlLiAiCisJCQkJCSsgZXguZ2V0TWVzc2FnZSgpOworCQkJbG9nZ2VyLmVycm9yKGV4TWVzc2FnZSk7CisJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyh0aGlzLCBleE1lc3NhZ2UsCisJCQkJCSJDcmVkZW50aWFsIE1hbmFnZXIgRXJyb3IiLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKwkJfQorCX0KKworCQorCS8qKgorCSAqIEVkaXQgc2VydmljZSBVUkxzIGZvciBhIGdpdmVuIGtleSBwYWlyIGVudHJ5LgorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXByaXZhdGUgdm9pZCBlZGl0S2V5UGFpcigpIHsKKwkJLy8gV2hpY2gga2V5IHBhaXIgZW50cnkgaGFzIGJlZW4gc2VsZWN0ZWQ/CisJCWludCBpUm93ID0ga2V5UGFpcnNUYWJsZS5nZXRTZWxlY3RlZFJvdygpOworCQlpZiAoaVJvdyA9PSAtMSkgeyAvLyBubyByb3cgY3VycmVudGx5IHNlbGVjdGVkCisJCQlyZXR1cm47CisJCX0KKworCQkvLyBCZWNhdXNlIHRoZSBhbGlhcyBjb2x1bW4gaXMgbm90IHZpc2libGUgd2UgY2FsbCB0aGUKKwkJLy8gZ2V0VmFsdWVBdCBtZXRob2Qgb24gdGhlIHRhYmxlIG1vZGVsIHJhdGhlciB0aGFuIGF0IHRoZSBKVGFibGUKKwkJU3RyaW5nIGFsaWFzID0gKFN0cmluZykga2V5UGFpcnNUYWJsZS5nZXRNb2RlbCgpLmdldFZhbHVlQXQoaVJvdywgNik7IC8vIGN1cnJlbnQgZW50cnkncyBLZXlzdG9yZSBhbGlhcworCisgICAgCS8vIEdldCB0aGUgbGlzdCBvZiBVUkxzIGZvciB0aGUgYWxpYXMKKwkJQXJyYXlMaXN0PFN0cmluZz4gc2VydmljZVVSTHMgPSAoQXJyYXlMaXN0PFN0cmluZz4pIGtleVBhaXJzVGFibGUuZ2V0TW9kZWwoKS5nZXRWYWx1ZUF0KGlSb3csIDUpOyAgIAorICAKKwkJLy8gTGV0IHRoZSB1c2VyIGVkaXQgdGhlIGxpc3Qgb2Ygc2VydmljZSB1cmxzIHRoaXMga2V5IHBhaXIgaXMKKwkJLy8gYXNzb2NpYXRlZCB0bworCQlFZGl0S2V5UGFpckVudHJ5RGlhbG9nIGRFZGl0S2V5UGFpciA9IG5ldyBFZGl0S2V5UGFpckVudHJ5RGlhbG9nKHRoaXMsCisJCQkJIkVkaXQga2V5IHBhaXIncyBzZXJ2aWNlIFVSTHMiLCB0cnVlLCBzZXJ2aWNlVVJMcyk7CisKKwkJZEVkaXRLZXlQYWlyLnNldExvY2F0aW9uUmVsYXRpdmVUbyh0aGlzKTsKKwkJZEVkaXRLZXlQYWlyLnNldFZpc2libGUodHJ1ZSk7CisKKwkJQXJyYXlMaXN0PFN0cmluZz4gbmV3U2VydmljZVVSTHMgPSBkRWRpdEtleVBhaXIuZ2V0U2VydmljZVVSTHMoKTsgLy8gbmV3IHNlcnZpY2UgVVJMcyBsaXN0CisKKwkJaWYgKG5ld1NlcnZpY2VVUkxzID09IG51bGwpIHsgLy8gdXNlciBjYW5jZWxsZWQKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIElzIGFueXRoaW5nIGFjdHVhbGx5IG1vZGlmaWVkPworCQlib29sZWFuIGlzTW9kaWZpZWQgPSAoIXNlcnZpY2VVUkxzLmVxdWFscyhuZXdTZXJ2aWNlVVJMcykpOworCisJCWlmIChpc01vZGlmaWVkKSB7CisJCQl0cnkgeworCQkJCS8vIEFkZCB0aGUgbmV3IGxpc3Qgb2YgVVJMcyBmb3IgdGhlIGFsaWFzCisJCQkJY3JlZE1hbmFnZXIuc2F2ZVNlcnZpY2VVUkxzRm9yS2V5UGFpcihhbGlhcywgbmV3U2VydmljZVVSTHMpOworCQkJfSAKKwkJCWNhdGNoIChDTUV4Y2VwdGlvbiBjbWUpIHsKKwkJCQlTdHJpbmcgZXhNZXNzYWdlID0gIkZhaWxlZCB0byB1cGRhdGUgc2VydmljZSBVUkxzIGZvciB0aGUga2V5IHBhaXIgZW50cnkiOworCQkJCWxvZ2dlci5lcnJvcihleE1lc3NhZ2UpOworCQkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsIGV4TWVzc2FnZSwKKwkJCQkJCSJDcmVkZW50aWFsIE1hbmFnZXIgRXJyb3IiLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKwkJCX0gCisJCX0gCisJfQorCisJLyoqCisJICogRXhwb3J0IHVzZXIncyBwcml2YXRlIGFuZCBwdWJsaWMga2V5IHBhaXIgdG8gYSBQS0NTICMxMgorCSAqIGtleXN0b3JlIGZpbGUuCisJICovCisJcHJpdmF0ZSB2b2lkIGV4cG9ydEtleVBhaXIoKSB7CisJCQorCQkvLyBXaGljaCBrZXkgcGFpciBlbnRyeSBoYXMgYmVlbiBzZWxlY3RlZD8KKwkJaW50IGlSb3cgPSBrZXlQYWlyc1RhYmxlLmdldFNlbGVjdGVkUm93KCk7CisJCWlmIChpUm93ID09IC0xKSB7IC8vIG5vIHJvdyBjdXJyZW50bHkgc2VsZWN0ZWQKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIEdldCB0aGUga2V5IHBhaXIgZW50cnkncyBLZXlzdG9yZSBhbGlhcworCQlTdHJpbmcgYWxpYXMgPSAoU3RyaW5nKSBrZXlQYWlyc1RhYmxlLmdldE1vZGVsKCkuZ2V0VmFsdWVBdChpUm93LCA2KTsgCisKKwkJLy8gTGV0IHRoZSB1c2VyIGNob29zZSBhIFBLQ1MgIzEyIGZpbGUgKGtleXN0b3JlKSB0byBleHBvcnQgcHVibGljIGFuZAorCQkvLyBwcml2YXRlIGtleSBwYWlyIHRvCisJCUZpbGUgZXhwb3J0RmlsZSA9IHNlbGVjdEltcG9ydEV4cG9ydEZpbGUoIlNlbGVjdCBhIGZpbGUgdG8gZXhwb3J0IHRvIiwgLy8gdGl0bGUKKwkJCQluZXcgU3RyaW5nW10geyAiLnAxMiIsICIucGZ4IiB9LCAvLyBhcnJheSBvZiBmaWxlIGV4dGVuc2lvbnMKKwkJCQkvLyBmb3IgdGhlIGZpbGUgZmlsdGVyCisJCQkJIlBLQ1MjMTIgRmlsZXMgKCoucDEyLCAqLnBmeCkiLCAvLyBkZXNjcmlwdGlvbiBvZiB0aGUgZmlsdGVyCisJCQkJIkV4cG9ydCIpOyAvLyB0ZXh0IGZvciB0aGUgZmlsZSBjaG9vc2VyJ3MgYXBwcm92ZSBidXR0b24KKworCQlpZiAoZXhwb3J0RmlsZSA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKworCQkvLyBJZiBmaWxlIGFscmVhZHkgZXhpc3QgLSBhc2sgdGhlIHVzZXIgaWYgaGUgd2FudHMgdG8gb3ZlcndyaXRlIGl0CisJCWlmIChleHBvcnRGaWxlLmlzRmlsZSgpKSB7CisJCQlpbnQgaVNlbGVjdGVkID0gSk9wdGlvblBhbmUKKwkJCQkJLnNob3dDb25maXJtRGlhbG9nKAorCQkJCQkJCXRoaXMsCisJCQkJCQkJIlRoZSBmaWxlIHdpdGggdGhlIGdpdmVuIG5hbWUgYWxyZWFkeSBleGlzdHMuXG5EbyB5b3Ugd2FudCB0byBvdmVyd3JpdGUgaXQ/IiwKKwkJCQkJCQkiQ3JlZGVudGlhbCBNYW5hZ2VyIEFsZXJ0IiwKKwkJCQkJCQlKT3B0aW9uUGFuZS5ZRVNfTk9fT1BUSU9OKTsKKworCQkJaWYgKGlTZWxlY3RlZCA9PSBKT3B0aW9uUGFuZS5OT19PUFRJT04pIHsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQkvLyBHZXQgdGhlIHVzZXIgdG8gZW50ZXIgdGhlIHBhc3N3b3JkIGZvciB0aGUgUEtDUyAjMTIga2V5c3RvcmUgZmlsZQorCQlHZXRQYXNzd29yZERpYWxvZyBkR2V0UGFzc3dvcmQgPSBuZXcgR2V0UGFzc3dvcmREaWFsb2codGhpcywKKwkJCQkiQ3JlZGVudGlhbCBNYW5hZ2VyIiwgdHJ1ZSwKKwkJCQkiRW50ZXIgdGhlIHBhc3N3b3JkIGZvciBwcm90ZWN0aW5nIHRoZSBleHBvcnRlZCBrZXkgcGFpciIpOworCQlkR2V0UGFzc3dvcmQuc2V0TG9jYXRpb25SZWxhdGl2ZVRvKHRoaXMpOworCQlkR2V0UGFzc3dvcmQuc2V0VmlzaWJsZSh0cnVlKTsKKworCQlTdHJpbmcgcGtjczEyUGFzc3dvcmQgPSBkR2V0UGFzc3dvcmQuZ2V0UGFzc3dvcmQoKTsKKworCQlpZiAocGtjczEyUGFzc3dvcmQgPT0gbnVsbCkgeyAvLyB1c2VyIGNhbmNlbGxlZCBvciBlbXB0eSBwYXNzd29yZAorCQkJLy8gV2FybiB0aGUgdXNlcgorCQkJSk9wdGlvblBhbmUKKwkJCQkJLnNob3dNZXNzYWdlRGlhbG9nKAorCQkJCQkJCXRoaXMsCisJCQkJCQkJIllvdSBtdXN0IHN1cHBseSBhIHBhc3N3b3JkIGZvciBwcm90ZWN0aW5nIHRoZSBleHBvcnRlZCBrZXkgcGFpci4iLAorCQkJCQkJCSJDcmVkZW50aWFsIE1hbmFnZXIgQWxlcnQiLAorCQkJCQkJCUpPcHRpb25QYW5lLklORk9STUFUSU9OX01FU1NBR0UpOworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gRXhwb3J0IHRoZSBrZXkgcGFpcgorCQl0cnkgeworCQkJY3JlZE1hbmFnZXIuZXhwb3J0S2V5UGFpcihhbGlhcywgZXhwb3J0RmlsZSwgcGtjczEyUGFzc3dvcmQpOworCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcywgIktleSBwYWlyIGV4cG9ydCBzdWNjZXNzZnVsIiwKKwkJCQkJCQkiQ3JlZGVudGlhbCBNYW5hZ2VyIEFsZXJ0IiwKKwkJCQkJCQlKT3B0aW9uUGFuZS5JTkZPUk1BVElPTl9NRVNTQUdFKTsKKwkJfSAKKwkJY2F0Y2ggKENNRXhjZXB0aW9uIGNtZSkgeworCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcywgY21lLmdldE1lc3NhZ2UoKSwKKwkJCQkJIkNyZWRlbnRpYWwgTWFuYWdlciBFcnJvciIsIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOworCQl9IAorCX0KKworCS8qKgorCSAqIERlbGV0ZSBzZWxlY3RlZCBrZXkgcGFpciBlbnRyaWVzIGZyb20gdGhlIEtleXN0b3JlLgorCSAqLworCXByaXZhdGUgdm9pZCBkZWxldGVLZXlQYWlyKCkgeworCQkKKwkJLy8gV2hpY2ggZW50cmllcyBoYXZlIGJlZW4gc2VsZWN0ZWQ/CisJCWludFtdIGlSb3dzID0ga2V5UGFpcnNUYWJsZS5nZXRTZWxlY3RlZFJvd3MoKTsKKwkJaWYgKGlSb3dzLmxlbmd0aCA9PSAwKSB7IC8vIG5vIGtleSBwYWlyIGVudHJ5IHNlbGVjdGVkCisJCQlyZXR1cm47CisJCX0KKworCQkvLyBBc2sgdXNlciB0byBjb25maXJtIHRoZSBkZWxldGlvbgorCQlpbnQgaVNlbGVjdGVkID0gSk9wdGlvblBhbmUKKwkJCQkuc2hvd0NvbmZpcm1EaWFsb2coCisJCQkJCQludWxsLAorCQkJCQkJIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhlIHNlbGVjdGVkIGtleSBwYWlycz8iLAorCQkJCQkJIkNyZWRlbnRpYWwgTWFuYWdlciBBbGVydCIsCisJCQkJCQlKT3B0aW9uUGFuZS5ZRVNfTk9fT1BUSU9OKTsKKworCQlpZiAoaVNlbGVjdGVkICE9IEpPcHRpb25QYW5lLllFU19PUFRJT04pIHsKKwkJCXJldHVybjsKKwkJfQorCQkJCQkKKwkJZm9yIChpbnQgaSA9IGlSb3dzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7IC8vIGRlbGV0ZSBmcm9tIGJhY2t3YXJkcworCQkJLy8gR2V0IHRoZSBhbGlhcyBmb3IgdGhlIGN1cnJlbnQgZW50cnkgCisJCQlTdHJpbmcgYWxpYXMgPSAoU3RyaW5nKSBrZXlQYWlyc1RhYmxlLmdldE1vZGVsKCkuZ2V0VmFsdWVBdCgKKwkJCQkJaVJvd3NbaV0sIDYpOworCQkJdHJ5IHsKKwkJCQkvLyBEZWxldGUgdGhlIGtleSBwYWlyIGVudHJ5IGZyb20gdGhlIEtleXN0b3JlCisJCQkJLy8gYW5kIFVSTHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMga2V5IHBhaXIgZW50cnkKKwkJCQljcmVkTWFuYWdlci5kZWxldGVLZXlQYWlyKGFsaWFzKTsKKwkJCX0gCisJCQljYXRjaCAoQ01FeGNlcHRpb24gY21lKSB7CisJCQkJU3RyaW5nIGV4TWVzc2FnZSA9ICJGYWlsZWQgdG8gZGVsZXRlIHRoZSBrZXkgcGFpcihzKSBmcm9tIHRoZSBLZXlzdG9yZSI7CisJCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcywgZXhNZXNzYWdlLAorCQkJCQkJIkNyZWRlbnRpYWwgTWFuYWdlciBFcnJvciIsCisJCQkJCQlKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKwkJCX0gCisJCX0KKwl9CisJCisJLyoqCisJICogU2hvdyB0aGUgY29udGVudHMgb2YgYSBwcm94eSBjZXJ0aWZpY2F0ZS4KKwkgKi8KKwlwcml2YXRlIHZvaWQgdmlld1Byb3h5Q2VydGlmaWNhdGUoKSB7CisKKwkJaW50IGlSb3cgPSBwcm94aWVzVGFibGUuZ2V0U2VsZWN0ZWRSb3coKTsKKwkJCisJCWlmIChpUm93ICE9IC0xKSB7IC8vIHNvbWV0aGluZyBoYXMgYmVlbiBzZWxlY3RlZAorCQkJU3RyaW5nIGFsaWFzID0gKFN0cmluZykgcHJveGllc1RhYmxlLmdldE1vZGVsKCkuZ2V0VmFsdWVBdChpUm93LCA1KTsKKwkJCQorCQkJaWYgKGFsaWFzLnN0YXJ0c1dpdGgoImNhZ3JpZHByb3h5IyIpKXsgLy8gY2FncmlkIHByb3h5CisJCQkJdHJ5IHsKKwkJCQkJLy8gR2V0IHRoZSBlbnRyeSdzIGNlcnRpZmljYXRlCisJCQkJCVg1MDlDZXJ0aWZpY2F0ZSBjZXJ0VG9WaWV3ID0gQ01YNTA5VXRpbC5jb252ZXJ0Q2VydGlmaWNhdGUoY3JlZE1hbmFnZXIKKwkJCQkJCQkuZ2V0Q2VydGlmaWNhdGUoQ3JlZGVudGlhbE1hbmFnZXIuS0VZU1RPUkUsIGFsaWFzKSk7CisKKwkJCQkJU3RyaW5nIGF1dGhOU2VydmljZVVSTCA9IGFsaWFzLnN1YnN0cmluZyhhbGlhcy5pbmRleE9mKCcjJykgKyAxLCBhbGlhcy5pbmRleE9mKCcgJykpOworCQkJCQlTdHJpbmcgZG9yaWFuU2VydmljZVVSTCA9IGFsaWFzLnN1YnN0cmluZyhhbGlhcy5pbmRleE9mKCcgJykgKzEpOyAKKwkJCQkJLy8gU3VwcGx5IHRoZSBjZXJ0aWZpY2F0ZSBhbmQgbGlzdCBvZiBVUkxzIHRvIHRoZSB2aWV3CisJCQkJCS8vIGNlcnRpZmljYXRlIGRpYWxvZy4gCisJCQkJCVZpZXdDYUdyaWRQcm94eUNlcnREZXRhaWxzRGlhbG9nIHZpZXdDYUdyaWRQcm94eUNlcnREZXRhaWxzRGlhbG9nID0gbmV3IFZpZXdDYUdyaWRQcm94eUNlcnREZXRhaWxzRGlhbG9nKAorCQkJCQkJCXRoaXMsICJDZXJ0aWZpY2F0ZSBkZXRhaWxzIiwgdHJ1ZSwgY2VydFRvVmlldywgYXV0aE5TZXJ2aWNlVVJMLCBkb3JpYW5TZXJ2aWNlVVJMKTsKKwkJCQkJdmlld0NhR3JpZFByb3h5Q2VydERldGFpbHNEaWFsb2cuc2V0TG9jYXRpb25SZWxhdGl2ZVRvKHRoaXMpOworCQkJCQl2aWV3Q2FHcmlkUHJveHlDZXJ0RGV0YWlsc0RpYWxvZy5zZXRWaXNpYmxlKHRydWUpOworCQkJCX0gCisJCQkJY2F0Y2ggKENNRXhjZXB0aW9uIGNtZSkgeworCQkJCQlTdHJpbmcgZXhNZXNzYWdlID0gIkZhaWxlZCB0byBnZXQgcHJveHkgY2VydGlmaWNhdGUgZGV0YWlscyB0byBkaXNwbGF5IHRvIHRoZSB1c2VyIjsKKwkJCQkJbG9nZ2VyLmVycm9yKGV4TWVzc2FnZSk7CisJCQkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsIGV4TWVzc2FnZSwKKwkJCQkJCQkiQ3JlZGVudGlhbCBNYW5hZ2VyIEVycm9yIiwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7CisJCQkJfSAKKwkJCX0KKwkJCS8vZWxzZXt9IC8vIHNvbWUgb3RoZXIgcHJveHkKKwkJfSAKKwl9CisJCisJLyoqCisJICogRGVsZXRlIHNlbGVjdGVkIHByb3h5IGVudHJpZXMgZnJvbSB0aGUgS2V5c3RvcmUuCisJICovCisJcHJpdmF0ZSB2b2lkIGRlbGV0ZVByb3h5KCkgeworCQkKKwkJLy8gV2hpY2ggZW50cmllcyBoYXZlIGJlZW4gc2VsZWN0ZWQ/CisJCWludFtdIGlSb3dzID0gcHJveGllc1RhYmxlLmdldFNlbGVjdGVkUm93cygpOworCQlpZiAoaVJvd3MubGVuZ3RoID09IDApIHsgLy8gbm8ga2V5IHBhaXIgZW50cnkgc2VsZWN0ZWQKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIEFzayB1c2VyIHRvIGNvbmZpcm0gdGhlIGRlbGV0aW9uCisJCWludCBpU2VsZWN0ZWQgPSBKT3B0aW9uUGFuZQorCQkJCS5zaG93Q29uZmlybURpYWxvZygKKwkJCQkJCW51bGwsCisJCQkJCQkiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUgc2VsZWN0ZWQgcHJveHkoaWVzKT8iLAorCQkJCQkJIkNyZWRlbnRpYWwgTWFuYWdlciBBbGVydCIsCisJCQkJCQlKT3B0aW9uUGFuZS5ZRVNfTk9fT1BUSU9OKTsKKworCQlpZiAoaVNlbGVjdGVkICE9IEpPcHRpb25QYW5lLllFU19PUFRJT04pIHsKKwkJCXJldHVybjsKKwkJfQorCQkJCQkKKwkJZm9yIChpbnQgaSA9IGlSb3dzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7IC8vIGRlbGV0ZSBmcm9tIGJhY2t3YXJkcworCQkJLy8gR2V0IHRoZSBhbGlhcyBmb3IgdGhlIGN1cnJlbnQgZW50cnkgCisJCQlTdHJpbmcgYWxpYXMgPSAoU3RyaW5nKSBwcm94aWVzVGFibGUuZ2V0TW9kZWwoKS5nZXRWYWx1ZUF0KAorCQkJCQlpUm93c1tpXSwgNSk7CisJCQl0cnkgeworCQkJCS8vIERlbGV0ZSB0aGUgcHJveHkgZW50cnkgZnJvbSB0aGUgS2V5c3RvcmUKKwkJCQljcmVkTWFuYWdlci5kZWxldGVDYUdyaWRQcm94eShhbGlhcyk7CisJCQl9IAorCQkJY2F0Y2ggKENNRXhjZXB0aW9uIGNtZSkgeworCQkJCVN0cmluZyBleE1lc3NhZ2UgPSAiRmFpbGVkIHRvIGRlbGV0ZSB0aGUgcHJveHkoaWVzKSBmcm9tIHRoZSBLZXlzdG9yZSI7CisJCQkJbG9nZ2VyLmVycm9yKGV4TWVzc2FnZSk7CisJCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcywgZXhNZXNzYWdlLAorCQkJCQkJIkNyZWRlbnRpYWwgTWFuYWdlciBFcnJvciIsCisJCQkJCQlKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKwkJCX0gCisJCX0KKwl9CisKKwkvKioKKwkgKiBJbXBvcnQgYSB0cnVzdGVkIGNlcnRpZmljYXRlIGZyb20gYSBQRU0gb3IgREVSIGVuY29kZWQgZmlsZQorCSAqIGludG8gdGhlIFRydXN0c3RvcmUuCisJICovCisJcHJpdmF0ZSB2b2lkIGltcG9ydFRydXN0ZWRDZXJ0aWZpY2F0ZSgpIHsKKwkJLy8gTGV0IHRoZSB1c2VyIGNob29zZSBhIGZpbGUgY29udGFpbmluZyB0cnVzdGVkIGNlcnRpZmljYXRlKHMpIHRvCisJCS8vIGltcG9ydAorCQlGaWxlIGNlcnRGaWxlID0gc2VsZWN0SW1wb3J0RXhwb3J0RmlsZSgKKwkJCQkiQ2VydGlmaWNhdGUgZmlsZSB0byBpbXBvcnQgZnJvbSIsIC8vIHRpdGxlCQorCQkJCW5ldyBTdHJpbmdbXSB7ICIucGVtIiwgImNydCIsICIuY2VyIiwgIi5kZXIiLCAiLnA3YyIgfSwgLy8gZmlsZSBleHRlbnNpb25zIGZpbHRlcnMKKwkJCQkiQ2VydGlmaWNhdGUgRmlsZXMgKCoucGVtLCAqLmNydCwgLCAqLmNlciwgKi5kZXIsICoucDdjKSIsIC8vIGZpbHRlciBkZXNjcmlwdGlvbgorCQkJCSJJbXBvcnQiKTsgLy8gdGV4dCBmb3IgdGhlIGZpbGUgY2hvb3NlcidzIGFwcHJvdmUgYnV0dG9uCisKKwkJaWYgKGNlcnRGaWxlID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIExvYWQgdGhlIGNlcnRpZmljYXRlKHMpIGZyb20gdGhlIGZpbGUKKwkJQXJyYXlMaXN0PFg1MDlDZXJ0aWZpY2F0ZT4gdHJ1c3RDZXJ0c0xpc3QgPSBuZXcgQXJyYXlMaXN0PFg1MDlDZXJ0aWZpY2F0ZT4oKTsKKwkJRmlsZUlucHV0U3RyZWFtIGZpcyA9IG51bGw7CisKKwkJdHJ5IHsKKwkJCWZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oY2VydEZpbGUpOworCQkJQ2VydGlmaWNhdGVGYWN0b3J5IGNmID0gQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKCJYLjUwOSIpOworCQkJLy8gVGhlIGZvbGxvd2luZyBzaG91bGQgYmUgYWJsZSB0byBsb2FkIFBLQ1MgIzcgY2VydGlmaWNhdGUgY2hhaW4gZmlsZXMKKwkJCS8vIGFzIHdlbGwgYXMgQVNOLjEgREVSIG9yIFBFTS1lbmNvZGVkIChzZXF1ZW5jZXMgb2YpIGNlcnRpZmljYXRlcworCQkJQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ2VydGlmaWNhdGU+IGMgPSBjZi5nZW5lcmF0ZUNlcnRpZmljYXRlcyhmaXMpOworCQkJSXRlcmF0b3I8PyBleHRlbmRzIENlcnRpZmljYXRlPiBpID0gYy5pdGVyYXRvcigpOworCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7CisJCQkJdHJ1c3RDZXJ0c0xpc3QuYWRkKChYNTA5Q2VydGlmaWNhdGUpIGkubmV4dCgpKTsKKwkJCX0KKwkJfSAKKwkJY2F0Y2ggKEV4Y2VwdGlvbiBjZXgpIHsKKwkJCS8vIERvIG5vdGhpbmcKKwkJfSAKKwkJZmluYWxseSB7CisJCQl0cnkgeworCQkJCWZpcy5jbG9zZSgpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisJCQkJLy8gaWdub3JlCisJCQl9CisJCX0KKworCQlpZiAodHJ1c3RDZXJ0c0xpc3Quc2l6ZSgpID09IDApIHsgLy8gQ291bGQgbm90IGxvYWQgY2VydGlmaWNhdGVzIGFzCisJCQkvLyBhbnkgb2YgdGhlIGFib3ZlIHR5cGVzCisJCQl0cnkgeworCQkJCS8vIFRyeSBhcyBvcGVuc3NsIFBFTSBmb3JtYXQgLSB3aGljaCBzbGlndGx5IGRpZmZlcnMgZnJvbSB0aGUKKwkJCQkvLyBvbmUgc3VwcG9ydGVkIGJ5IEpDRQorCQkJCWZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oY2VydEZpbGUpOworCQkJCUNlcnRpZmljYXRlRmFjdG9yeSBjZiA9IENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZSgiWC41MDkiKTsKKwkJCQlQRU1SZWFkZXIgcHIgPSBuZXcgUEVNUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihmaXMpLCBudWxsLAorCQkJCQkJY2YuZ2V0UHJvdmlkZXIoKS5nZXROYW1lKCkpOworCQkJCU9iamVjdCBjZXJ0OworCQkJCXdoaWxlICgoY2VydCA9IHByLnJlYWRPYmplY3QoKSkgIT0gbnVsbCkgeworCQkJCQlpZiAoY2VydCBpbnN0YW5jZW9mIFg1MDlDZXJ0aWZpY2F0ZSkgeworCQkJCQkJdHJ1c3RDZXJ0c0xpc3QuYWRkKChYNTA5Q2VydGlmaWNhdGUpIGNlcnQpOworCQkJCQl9CisJCQkJfQorCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGNleCkgeworCQkJCS8vIGRvIG5vdGhpbmcKKwkJCX0gZmluYWxseSB7CisJCQkJdHJ5IHsKKwkJCQkJZmlzLmNsb3NlKCk7CisJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisJCQkJCS8vIGlnbm9yZQorCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmICh0cnVzdENlcnRzTGlzdC5zaXplKCkgPT0gMCkgeyAvLyBGYWlsZWQgdG8gbG9hZCBjZXJ0aWZjYXRlKHMpCisJCQkvLyB1c2luZyBhbnkgb2YgdGhlIGtub3duIGVuY29kaW5ncworCQkJSk9wdGlvblBhbmUKKwkJCQkJLnNob3dNZXNzYWdlRGlhbG9nKAorCQkJCQkJCXRoaXMsCisJCQkJCQkJIkZhaWxlZCB0byBsb2FkIGNlcnRpZmljYXRlKHMpIHVzaW5nIGFueSBvZiB0aGUga25vd24gZW5jb2RpbmdzIC1cbmZpbGUgZm9ybWF0IG5vdCByZWNvZ25pc2VkLiIsCisJCQkJCQkJIkNyZWRlbnRpYWwgTWFuYWdlciBFcnJvciIsCisJCQkJCQkJSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7CisJCQlyZXR1cm47CisJCX0KKworCQkvLyBTaG93IHRoZSBsaXN0IG9mIGNlcnRpZmljYXRlcyBjb250YWluZWQgaW4gdGhlIGZpbGUgZm9yIHRoZSB1c2VyIHRvCisJCS8vIHNlbGVjdCB0aGUgb25lcyB0byBpbXBvcnQKKwkJTmV3VHJ1c3RDZXJ0c0RpYWxvZyBkSW1wb3J0VHJ1c3RDZXJ0cyA9IG5ldyBOZXdUcnVzdENlcnRzRGlhbG9nKHRoaXMsCisJCQkJIkNyZWRlbnRpYWwgTWFuYWdlciIsIHRydWUsIHRydXN0Q2VydHNMaXN0KTsKKworCQlkSW1wb3J0VHJ1c3RDZXJ0cy5zZXRMb2NhdGlvblJlbGF0aXZlVG8odGhpcyk7CisJCWRJbXBvcnRUcnVzdENlcnRzLnNldFZpc2libGUodHJ1ZSk7CisJCUFycmF5TGlzdDxYNTA5Q2VydGlmaWNhdGU+IHNlbGVjdGVkVHJ1c3RDZXJ0cyA9IGRJbXBvcnRUcnVzdENlcnRzCisJCQkJLmdldFRydXN0ZWRDZXJ0aWZpY2F0ZXMoKTsgLy8gdXNlci1zZWxlY3RlZCB0cnVzdGVkIGNlcnRzIHRvIGltcG9ydAorCisJCS8vIElmIHVzZXIgY2FuY2VsbGVkIG9yIGRpZCBub3Qgc2VsZWN0IGFueSBjZXJ0IHRvIGltcG9ydAorCQlpZiAoKHNlbGVjdGVkVHJ1c3RDZXJ0cykgPT0gbnVsbCB8fCAoc2VsZWN0ZWRUcnVzdENlcnRzLnNpemUoKSA9PSAwKSkgeyAKKwkJCXJldHVybiA7CisJCX0KKworCQl0cnkgeworCQkJCisJCQlmb3IgKGludCBpID0gc2VsZWN0ZWRUcnVzdENlcnRzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCQkJLy8gSW1wb3J0IHRoZSBzZWxlY3RlZCB0cnVzdGVkIGNlcnRpZmljYXRlcworCQkJCWNyZWRNYW5hZ2VyLnNhdmVUcnVzdGVkQ2VydGlmaWNhdGUoc2VsZWN0ZWRUcnVzdENlcnRzLmdldChpKSk7CisJCQl9CisKKwkJCS8vIERpc3BsYXkgc3VjY2VzcyBtZXNzYWdlCisJCQlKT3B0aW9uUGFuZQorCQkJCQkuc2hvd01lc3NhZ2VEaWFsb2codGhpcywKKwkJCQkJCQkiVHJ1c3RlZCBjZXJ0aWZpY2F0ZShzKSBpbXBvcnQgc3VjY2Vzc2Z1bCIsCisJCQkJCQkJIkNyZWRlbnRpYWwgTWFuYWdlciBBbGVydCIsCisJCQkJCQkJSk9wdGlvblBhbmUuSU5GT1JNQVRJT05fTUVTU0FHRSk7CisJCX0gCisJCWNhdGNoIChDTUV4Y2VwdGlvbiBjbWUpIHsKKwkJCVN0cmluZyBleE1lc3NhZ2UgPSAiRmFpbGVkIHRvIGltcG9ydCB0cnVzdGVkIGNlcnRpZmljYXRlKHMpIHRvIHRoZSBUcnVzdHN0b3JlIjsKKwkJCWxvZ2dlci5lcnJvcihleE1lc3NhZ2UpOworCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcywgZXhNZXNzYWdlLAorCQkJCQkiQ3JlZGVudGlhbCBNYW5hZ2VyIEVycm9yIiwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7CisJCX0gCisJfQorCisJCisJLyoqCisJICogTGV0cyB0aGUgdXNlciBleHBvcnQgb25lIChhdCB0aGUgbW9tZW50KSBvciBtb3JlIChpbiBmdXR1cmUpIHRydXN0ZWQKKwkgKiBjZXJ0aWZpY2F0ZSBlbnRyaWVzIHRvIGEgUEVNLWVuY29kZWQgZmlsZS4KKwkgKiAKKwkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGV4cG9ydCBpcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gZXhwb3J0VHJ1c3RlZENlcnRpZmljYXRlKCkgeworCisJCS8vIFdoaWNoIHRydXN0ZWQgY2VydGlmaWNhdGUgaGFzIGJlZW4gc2VsZWN0ZWQ/CisJCWludCBpUm93ID0gdHJ1c3RlZENlcnRzVGFibGUuZ2V0U2VsZWN0ZWRSb3coKTsKKwkJaWYgKGlSb3cgPT0gLTEpIHsgLy8gbm8gcm93IGN1cnJlbnRseSBzZWxlY3RlZAorCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJLy8gR2V0IHRoZSB0cnVzdCBjZXJ0aWZpY2F0ZSBlbnRyeSdzIEtleXN0b3JlIGFsaWFzCisJCVN0cmluZyBhbGlhcyA9IChTdHJpbmcpIHRydXN0ZWRDZXJ0c1RhYmxlLmdldE1vZGVsKCkuZ2V0VmFsdWVBdChpUm93LCAzKTsgCisJCS8vIHRoZSBhbGlhcyBjb2x1bW4gaXMgaW52aXNpYmxlIHNvIHdlIGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgdGFibGUgbW9kZWwKKworCQkvLyBMZXQgdGhlIHVzZXIgY2hvb3NlIGEgZmlsZSB0byBleHBvcnQgcHVibGljIGFuZCBwcml2YXRlIGtleSBwYWlyIHRvCisJCUZpbGUgZXhwb3J0RmlsZSA9IHNlbGVjdEltcG9ydEV4cG9ydEZpbGUoIlNlbGVjdCBhIGZpbGUgdG8gZXhwb3J0IHRvIiwgLy8gdGl0bGUKKwkJCQluZXcgU3RyaW5nW10geyAiLnBlbSIgfSwgLy8gYXJyYXkgb2YgZmlsZSBleHRlbnNpb25zIGZvciB0aGUKKwkJCQkvLyBmaWxlIGZpbHRlcgorCQkJCSJDZXJ0aWZpY2F0ZSBGaWxlcyAoKi5wZW0pIiwgLy8gZGVzY3JpcHRpb24gb2YgdGhlIGZpbHRlcgorCQkJCSJFeHBvcnQiKTsgLy8gdGV4dCBmb3IgdGhlIGZpbGUgY2hvb3NlcidzIGFwcHJvdmUgYnV0dG9uCisKKwkJaWYgKGV4cG9ydEZpbGUgPT0gbnVsbCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJLy8gSWYgZmlsZSBhbHJlYWR5IGV4aXN0IC0gYXNrIHRoZSB1c2VyIGlmIGhlIHdhbnRzIHRvIG92ZXJ3cml0ZSBpdAorCQlpZiAoZXhwb3J0RmlsZS5pc0ZpbGUoKSkgeworCQkJaW50IGlTZWxlY3RlZCA9IEpPcHRpb25QYW5lCisJCQkJCS5zaG93Q29uZmlybURpYWxvZygKKwkJCQkJCQl0aGlzLAorCQkJCQkJCSJUaGUgZmlsZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGFscmVhZHkgZXhpc3RzLlxuRG8geW91IHdhbnQgdG8gb3ZlcndyaXRlIGl0PyIsCisJCQkJCQkJIkNyZWRlbnRpYWwgTWFuYWdlciBBbGVydCIsCisJCQkJCQkJSk9wdGlvblBhbmUuWUVTX05PX09QVElPTik7CisKKwkJCWlmIChpU2VsZWN0ZWQgPT0gSk9wdGlvblBhbmUuTk9fT1BUSU9OKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisKKwkJLy8gRXhwb3J0IHRoZSB0cnVzdGVkIGNlcnRpZmljYXRlCisJCVBFTVdyaXRlciBwdyA9IG51bGw7CisJCXRyeSB7CisJCQkvLyBHZXQgdGhlIHRydXN0ZWQgY2VydGlmaWNhdGUKKwkJCUNlcnRpZmljYXRlIGNlcnRUb0V4cG9ydCA9IGNyZWRNYW5hZ2VyLmdldENlcnRpZmljYXRlKAorCQkJCQlDcmVkZW50aWFsTWFuYWdlci5UUlVTVFNUT1JFLCBhbGlhcyk7CisJCQlwdyA9IG5ldyBQRU1Xcml0ZXIobmV3IEZpbGVXcml0ZXIoZXhwb3J0RmlsZSkpOworCQkJcHcud3JpdGVPYmplY3QoY2VydFRvRXhwb3J0KTsKKworCQkJSk9wdGlvblBhbmUKKwkJCQkJLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsCisJCQkJCQkJIlRydXN0ZWQgY2VydGlmaWNhdGUgZXhwb3J0IHN1Y2Nlc3NmdWwiLAorCQkJCQkJCSJDcmVkZW50aWFsIE1hbmFnZXIgQWxlcnQiLAorCQkJCQkJCUpPcHRpb25QYW5lLklORk9STUFUSU9OX01FU1NBR0UpOworCisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSAKKwkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworCQkJU3RyaW5nIGV4TWVzc2FnZSA9ICJGYWlsZWQgdG8gZXhwb3J0IHRoZSB0cnVzdGVkIGNlcnRpZmljYXRlIGZyb20gdGhlIFRydXN0c3RvcmUuIjsKKwkJCWxvZ2dlci5lcnJvcihleE1lc3NhZ2UpOworCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2coCisJCQkJCQkJdGhpcywKKwkJCQkJCQlleE1lc3NhZ2UsCisJCQkJCQkJIkNyZWRlbnRpYWwgTWFuYWdlciBFcnJvciIsCisJCQkJCQkJSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0gCisJCWZpbmFsbHkgeworCQkJaWYgKHB3ICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQlwdy5jbG9zZSgpOworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisJCQkJCS8vIGlnbm9yZQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkKKwkvKioKKwkgKiBEZWxldGUgc2VsZWN0ZWQgdHJ1c3RlZCBjZXJ0aWZpY2F0ZSBlbnRyaWVzIGZyb20gdGhlIFRydXN0c3RvcmUuCisJICovCisJcHJpdmF0ZSB2b2lkIGRlbGV0ZVRydXN0ZWRDZXJ0aWZpY2F0ZSgpIHsKKwkJCisJCS8vIFdoaWNoIGVudHJpZXMgaGF2ZSBiZWVuIHNlbGVjdGVkPworCQlpbnRbXSBpUm93cyA9IHRydXN0ZWRDZXJ0c1RhYmxlLmdldFNlbGVjdGVkUm93cygpOworCQlpZiAoaVJvd3MubGVuZ3RoID09IDApIHsgLy8gbm8gdHJ1c3RlZCBjZXJ0IGVudHJ5IHNlbGVjdGVkCisJCQlyZXR1cm47CisJCX0KKworCQkvLyBBc2sgdXNlciB0byBjb25maXJtIHRoZSBkZWxldGlvbgorCQlpbnQgaVNlbGVjdGVkID0gSk9wdGlvblBhbmUKKwkJCQkuc2hvd0NvbmZpcm1EaWFsb2coCisJCQkJCQludWxsLAorCQkJCQkJIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhlIHNlbGVjdGVkIHRydXN0ZWQgY2VydGlmaWNhdGUocyk/IiwKKwkJCQkJCSJDcmVkZW50aWFsIE1hbmFnZXIgQWxlcnQiLAorCQkJCQkJSk9wdGlvblBhbmUuWUVTX05PX09QVElPTik7CisKKwkJaWYgKGlTZWxlY3RlZCAhPSBKT3B0aW9uUGFuZS5ZRVNfT1BUSU9OKSB7CisJCQlyZXR1cm47CisJCX0KKwkJCQkJCisJCWZvciAoaW50IGkgPSBpUm93cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeyAvLyBkZWxldGUgZnJvbSBiYWNrd2FyZHMKKwkJCS8vIEdldCB0aGUgYWxpYXMgZm9yIHRoZSBjdXJyZW50IGVudHJ5IAorCQkJU3RyaW5nIGFsaWFzID0gKFN0cmluZykgdHJ1c3RlZENlcnRzVGFibGUuZ2V0TW9kZWwoKS5nZXRWYWx1ZUF0KAorCQkJCQlpUm93c1tpXSwgNSk7CisJCQl0cnkgeworCQkJCS8vIERlbGV0ZSB0aGUgdHJ1c3RlZCBjZXJ0aWZpY2F0ZSBlbnRyeSBmcm9tIHRoZSBUcnVzdHN0b3JlCisJCQkJY3JlZE1hbmFnZXIuZGVsZXRlVHJ1c3RlZENlcnRpZmljYXRlKGFsaWFzKTsKKwkJCX0gCisJCQljYXRjaCAoQ01FeGNlcHRpb24gY21lKSB7CisJCQkJU3RyaW5nIGV4TWVzc2FnZSA9ICJGYWlsZWQgdG8gZGVsZXRlIHRoZSB0cnVzdGVkIGNlcnRpZmljYXRlKHMpIGZyb20gdGhlIFRydXN0c3RvcmUiOworCQkJCWxvZ2dlci5lcnJvcihleE1lc3NhZ2UpOworCQkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsIGV4TWVzc2FnZSwKKwkJCQkJCSJDcmVkZW50aWFsIE1hbmFnZXIgRXJyb3IiLAorCQkJCQkJSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7CisJCQl9IAorCQl9CisJfQorCQorCS8qKgorCSAqIEhhbmRsZSBkb3VibGUgY2xpY2sgb24gdGhlIEtleXN0b3JlIHRhYmxlcy4gSWYgaXQgaGFzIG9jY3VycmVkLCBzaG93IHRoZQorCSAqIGRldGFpbHMgb2YgdGhlIGVudHJ5IGNsaWNrZWQgdXBvbi4KKwkgKi8KKwlwcml2YXRlIHZvaWQgdGFibGVEb3VibGVDbGljayhNb3VzZUV2ZW50IGV2dCkgeworCQlpZiAoZXZ0LmdldENsaWNrQ291bnQoKSA+IDEpIHsgLy8gaXMgaXQgZG91YmxlIGNsaWNrPworCisJCQkvLyBXaGF0IHJvdyBhbmQgY29sdW1uIHdlcmUgY2xpY2tlZCB1cG9uIChpZiBhbnkpPworCQkJUG9pbnQgcG9pbnQgPSBuZXcgUG9pbnQoZXZ0LmdldFgoKSwgZXZ0LmdldFkoKSk7CisJCQlpbnQgaVJvdyA9ICgoSlRhYmxlKSBldnQuZ2V0U291cmNlKCkpLnJvd0F0UG9pbnQocG9pbnQpOworCQkJaWYgKGlSb3cgPT0gLTEpIHsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkvLyBXaGljaCB0YWJsZSB0aGUgY2xpY2sgb2NjdXJlZCBvbj8KKwkJCWlmICgoKEpUYWJsZSkgZXZ0LmdldFNvdXJjZSgpKS5nZXRNb2RlbCgpIGluc3RhbmNlb2YgUGFzc3dvcmRzVGFibGVNb2RlbCkgeyAvLyBQYXNzd29yZHMgdGFibGUKKwkJCQl2aWV3UGFzc3dvcmQoKTsKKwkJCX0gCisJCQllbHNlIGlmICgoKEpUYWJsZSkgZXZ0LmdldFNvdXJjZSgpKS5nZXRNb2RlbCgpIGluc3RhbmNlb2YgS2V5UGFpcnNUYWJsZU1vZGVsKSB7IC8vIEtleSBwYWlycyB0YWJsZQorCQkJCXZpZXdDZXJ0aWZpY2F0ZSgpOworCQkJfSAKKwkJCWVsc2UgaWYgKCgoSlRhYmxlKSBldnQuZ2V0U291cmNlKCkpLmdldE1vZGVsKCkgaW5zdGFuY2VvZiBQcm94aWVzVGFibGVNb2RlbCkgeyAvL1Byb3hpZXMgdGFibGUKKwkJCQl2aWV3UHJveHlDZXJ0aWZpY2F0ZSgpOworCQkJfQorCQkJZWxzZSB7IC8vIFRydXN0ZWQgY2VydGlmaWNhdGVzIHRhYmxlCisJCQkJdmlld0NlcnRpZmljYXRlKCk7CisJCQl9CisJCX0KKwl9CisJCisJLyoqCisJICogTGV0IHRoZSB1c2VyIHNlbGVjdCBhIGZpbGUgdG8gZXhwb3J0IHRvIG9yIGltcG9ydCBmcm9tIGEga2V5IHBhaXIgb3IgYQorCSAqIGNlcnRpZmljYXRlLiBUaGUgZmlsZSB0eXBlcyBhcmUgZmlsdGVyZWQgYWNjb3JkaW5nIHRvIHRoZWlyIGV4dGVuc2lvbnM6CisJICogLnAxMiBvciAucGZ4IGFyZSBQS0NTICMxMiBrZXlzdG9yZSBmaWxlcyBjb250YWluaW5nIHByaXZhdGUga2V5IGFuZCBpdHMKKwkgKiBwdWJsaWMga2V5ICgrY2VydCBjaGFpbikgLmNydCBhcmUgQVNOLjEgUEVNLWVuY29kZWQgZmlsZXMgY29udGFpbmluZyBvbmUKKwkgKiAob3IgbW9yZSBjb25jYXRlbmF0ZWQpIHB1YmxpYyBrZXkgY2VydGlmaWNhdGUocykgLmRlciBhcmUgQVNOLjEKKwkgKiBERVItZW5jb2RlZCBmaWxlcyBjb250YWluaW5nIG9uZSBwdWJsaWMga2V5IGNlcnRpZmljYXRlIC5jZXIgYXJlCisJICogQ0VSLWVuY29kZWQgZmlsZXMgY29udGFpbmluZyBvbmUgb3JlIG1vcmUgREVSLWVuY29kZWQgY2VydGlmaWNhdGVzCisJICovCisJcHJpdmF0ZSBGaWxlIHNlbGVjdEltcG9ydEV4cG9ydEZpbGUoU3RyaW5nIHRpdGxlLCBTdHJpbmdbXSBmaWx0ZXIsCisJCQlTdHJpbmcgZGVzY3JpcHRpb24sIFN0cmluZyBhcHByb3ZlQnV0dG9uVGV4dCkgeworCisJCUpGaWxlQ2hvb3NlciBjaG9vc2VyID0gbmV3IEpGaWxlQ2hvb3NlcigpOworCQljaG9vc2VyCisJCQkJLmFkZENob29zYWJsZUZpbGVGaWx0ZXIobmV3IENyeXB0b0ZpbGVGaWx0ZXIoZmlsdGVyLAorCQkJCQkJZGVzY3JpcHRpb24pKTsKKwkJY2hvb3Nlci5zZXREaWFsb2dUaXRsZSh0aXRsZSk7CisJCWNob29zZXIuc2V0TXVsdGlTZWxlY3Rpb25FbmFibGVkKGZhbHNlKTsKKworCQlpbnQgcnRuVmFsdWUgPSBjaG9vc2VyLnNob3dEaWFsb2codGhpcywgYXBwcm92ZUJ1dHRvblRleHQpOworCQlpZiAocnRuVmFsdWUgPT0gSkZpbGVDaG9vc2VyLkFQUFJPVkVfT1BUSU9OKSB7CisJCQlGaWxlIHNlbGVjdGVkRmlsZSA9IGNob29zZXIuZ2V0U2VsZWN0ZWRGaWxlKCk7CisJCQlyZXR1cm4gc2VsZWN0ZWRGaWxlOworCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwkvKioKKwkgKiBFeGl0IHRoZSBVSSdzIGZyYW1lLgorCSAqLworCXByaXZhdGUgdm9pZCBjbG9zZUZyYW1lKCkgeworCQlzZXRWaXNpYmxlKGZhbHNlKTsKKwkJZGlzcG9zZSgpOworCX0KKworCQorLy8JLyoqCisvLwkgKiBTZXQgY3Vyc29yIHRvIGJ1c3kgYW5kIGRpc2FibGUgYXBwbGljYXRpb24gaW5wdXQuIFRoaXMgY2FuIGJlIHJldmVyc2VkIGJ5CisvLwkgKiBhIHN1YnNlcXVlbnQgY2FsbCB0byBzZXRDdXJzb3JGcmVlLgorLy8JICovCisvLwlwcml2YXRlIHZvaWQgc2V0Q3Vyc29yQnVzeSgpIHsKKy8vCQkvLyBCbG9jayBhbGwgbW91c2UgZXZlbnRzIHVzaW5nIGdsYXNzIHBhbmUKKy8vCQlDb21wb25lbnQgZ2xhc3NQYW5lID0gZ2V0Um9vdFBhbmUoKS5nZXRHbGFzc1BhbmUoKTsKKy8vCQlnbGFzc1BhbmUuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgeworLy8JCX0pOworLy8JCWdsYXNzUGFuZS5zZXRWaXNpYmxlKHRydWUpOworLy8KKy8vCQkvLyBTZXQgY3Vyc29yIHRvIGJ1c3kKKy8vCQlnbGFzc1BhbmUuc2V0Q3Vyc29yKEN1cnNvci5nZXRQcmVkZWZpbmVkQ3Vyc29yKEN1cnNvci5XQUlUX0NVUlNPUikpOworLy8JfQorLy8KKy8vCQorLy8JLyoqCisvLwkgKiBTZXQgY3Vyc29yIHRvIGZyZWUgYW5kIGVuYWJsZSBhcHBsaWNhdGlvbiBpbnB1dC4gQ2FsbGVkIGFmdGVyIGEgY2FsbCB0bworLy8JICogc2V0Q3Vyc29yQnVzeS4KKy8vCSAqLworLy8JcHJpdmF0ZSB2b2lkIHNldEN1cnNvckZyZWUoKSB7CisvLwkJLy8gQWNjZXB0IG1vdXNlIGV2ZW50cworLy8JCUNvbXBvbmVudCBnbGFzc1BhbmUgPSBnZXRSb290UGFuZSgpLmdldEdsYXNzUGFuZSgpOworLy8JCWdsYXNzUGFuZS5zZXRWaXNpYmxlKGZhbHNlKTsKKy8vCisvLwkJLy8gUmV2ZXJ0IGN1cnNvciB0byBkZWZhdWx0CisvLwkJZ2xhc3NQYW5lLnNldEN1cnNvcihDdXJzb3IuZ2V0UHJlZGVmaW5lZEN1cnNvcihDdXJzb3IuREVGQVVMVF9DVVJTT1IpKTsKKy8vCX0KKy8vCQkJCisvLwkvKioKKy8vCSAqIEFjdGlvbiBoZWxwZXIgY2xhc3MuCisvLwkgKi8KKy8vCXByaXZhdGUgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBY3Rpb24gZXh0ZW5kcyBqYXZheC5zd2luZy5BYnN0cmFjdEFjdGlvbiB7CisvLwkJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWN0KCk7CisvLworLy8JCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldnQpIHsKKy8vCQkJc2V0Q3Vyc29yQnVzeSgpOworLy8JCQlyZXBhaW50KCk7CisvLwkJCW5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworLy8JCQkJcHVibGljIHZvaWQgcnVuKCkgeworLy8JCQkJCXRyeSB7CisvLwkJCQkJCWFjdCgpOworLy8JCQkJCX0gZmluYWxseSB7CisvLwkJCQkJCXNldEN1cnNvckZyZWUoKTsKKy8vCQkJCQl9CisvLwkJCQl9CisvLwkJCX0pLnN0YXJ0KCk7CisvLwkJfQorLy8JfQorCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL25ldC9zZi90YXZlcm5hL3QyL3dvcmtiZW5jaC91aS9jcmVkZW50aWFsbWFuYWdlci9DcmVkZW50aWFsTWFuYWdlclVJTGF1bmNoZXIuamF2YSBiL3NyYy9tYWluL2phdmEvbmV0L3NmL3RhdmVybmEvdDIvd29ya2JlbmNoL3VpL2NyZWRlbnRpYWxtYW5hZ2VyL0NyZWRlbnRpYWxNYW5hZ2VyVUlMYXVuY2hlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNzUwMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL25ldC9zZi90YXZlcm5hL3QyL3dvcmtiZW5jaC91aS9jcmVkZW50aWFsbWFuYWdlci9DcmVkZW50aWFsTWFuYWdlclVJTGF1bmNoZXIuamF2YQpAQCAtMCwwICsxLDExNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgVW5pdmVyc2l0eSBvZiBNYW5jaGVzdGVyICAgCisgKiAKKyAqICBNb2RpZmljYXRpb25zIHRvIHRoZSBpbml0aWFsIGNvZGUgYmFzZSBhcmUgY29weXJpZ2h0IG9mIHRoZWlyCisgKiAgcmVzcGVjdGl2ZSBhdXRob3JzLCBvciB0aGVpciBlbXBsb3llcnMgYXMgYXBwcm9wcmlhdGUuCisgKiAKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogICAgCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAgICAKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG5ldC5zZi50YXZlcm5hLnQyLndvcmtiZW5jaC51aS5jcmVkZW50aWFsbWFuYWdlcjsKKworaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKK2ltcG9ydCBqYXZhLmF3dC5EaW1lbnNpb247CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7CisKK2ltcG9ydCBqYXZheC5zd2luZy5JbWFnZUljb247CitpbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKK2ltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7CitpbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOworaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKK2ltcG9ydCBqYXZheC5zd2luZy5Td2luZ1V0aWxpdGllczsKK2ltcG9ydCBqYXZheC5zd2luZy5XaW5kb3dDb25zdGFudHM7CisKKy8qKgorICogCisgKiBUZXN0IGxhdW5jaGVyIGZvciBDcmVkZW50aWFsIE1hbmFnZXIgR1VJIChzbyBpdCBkb2VzIG5vdCBoYXZlIHRvIGJlCisgKiBsYXVuY2hlZCBmcm9tIFRhdmVybmEpLgorICogQGF1dGhvciBBbGV4YW5kcmEgTmVuYWRpYworICoKKyAqLworcHVibGljIGNsYXNzIENyZWRlbnRpYWxNYW5hZ2VyVUlMYXVuY2hlciBleHRlbmRzIEpGcmFtZSB7CisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjA3OTgwNTA2MDE3MDI1MTE0OEw7CisJCisJcHJpdmF0ZSBmaW5hbCBJbWFnZUljb24gbGF1bmNoQ01JY29uID0gbmV3IEltYWdlSWNvbihDcmVkZW50aWFsTWFuYWdlclVJTGF1bmNoZXIuY2xhc3MuZ2V0UmVzb3VyY2UoCisJIi9pbWFnZXMvY3JlZF9tYW5hZ2VyLnBuZyIpKTsKKwkKKwlwdWJsaWMgQ3JlZGVudGlhbE1hbmFnZXJVSUxhdW5jaGVyKCl7CisJCQorCQlKUGFuZWwganBMYXVuY2ggPSBuZXcgSlBhbmVsKCk7CisJCWpwTGF1bmNoLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbiAoMzAwLCAxMjApKTsKKwkJCisJCUpMYWJlbCBqbExhdW5jaCA9IG5ldyBKTGFiZWwoIlQyOiBMYXVuY2ggQ3JlZGVudGlhbCBNYW5hZ2VyIEdVSSIpOworCQkKKwkJSkJ1dHRvbiBqYkxhdW5jaCA9IG5ldyBKQnV0dG9uKCk7CisJCWpiTGF1bmNoLnNldEljb24obGF1bmNoQ01JY29uKTsKKwkJamJMYXVuY2guc2V0VG9vbFRpcFRleHQoIkxhdW5jaGVzIENyZWRlbnRpYWwgTWFuYWdlciIpOworCQlqYkxhdW5jaC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKXsKKworCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKKwkJCQlDcmVkZW50aWFsTWFuYWdlclVJIGNtR1VJID0gQ3JlZGVudGlhbE1hbmFnZXJVSS5nZXRJbnN0YW5jZSgpOworCQkJCS8vaWYgKGNtR1VJLmlzSW5pdGlhbGlzZWQoKSl7CisJCQkJCWNtR1VJLnNldFZpc2libGUodHJ1ZSk7CisJCQkJLy99CisJCQl9CisJCX0pOworCQkKKwkJanBMYXVuY2guYWRkKGpsTGF1bmNoKTsKKwkJanBMYXVuY2guYWRkKGpiTGF1bmNoKTsKKworCQlnZXRDb250ZW50UGFuZSgpLmFkZChqcExhdW5jaCxCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKwkJCisgICAgICAgIC8vIEhhbmRsZSBhcHBsaWNhdGlvbiBjbG9zZQorICAgICAgICBzZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oV2luZG93Q29uc3RhbnRzLkVYSVRfT05fQ0xPU0UpOworICAgIAorCQlwYWNrKCk7CisKKyAgICAgICAgLy8gQ2VudHJlIHRoZSBmcmFtZSBpbiB0aGUgY2VudHJlIG9mIHRoZSBkZXNrdG9wCisgICAgICAgIHNldExvY2F0aW9uUmVsYXRpdmVUbyhudWxsKTsKKyAgICAgICAgCisgICAgICAgIC8vIFNldCB0aGUgZnJhbWUncyB0aXRsZQorICAgICAgICBzZXRUaXRsZSgiQ3JlZGVudGlhbCBNYW5hZ2VyIEdVSSBMYXVuY2hlciIpOworICAgICAgICAKKyAgICAgICAgc2V0VmlzaWJsZSh0cnVlKTsKKwkJCisJfQorCQorCQorICAgIC8qKgorICAgICAqIFJ1bm5hYmxlIHRvIGNyZWF0ZSBhbmQgc2hvdyB0aGUgQ3JlZGVudGlhbCBNYW5hZ2VyIExhdW5jaGVyJ3MgR1VJLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENyZWF0ZUFuZFNob3dHdWkKKyAgICAgICAgaW1wbGVtZW50cyBSdW5uYWJsZQorICAgIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGFuZCBzaG93IHRoZSBsYXVuY2hlciBHVUkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQorICAgICAgICB7CisgICAgICAgICAgICBuZXcgQ3JlZGVudGlhbE1hbmFnZXJVSUxhdW5jaGVyKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogTGF1bmNoZXIgZm9yIHRoZSBDcmVkZW50aWFsIE1hbmFnZXIgR1VJLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCisgICAgeworICAgICAgICAvLyBDcmVhdGUgYW5kIHNob3cgR1VJIG9uIHRoZSBldmVudCBoYW5kbGVyIHRocmVhZAorICAgICAgICBTd2luZ1V0aWxpdGllcy5pbnZva2VMYXRlcihuZXcgQ3JlYXRlQW5kU2hvd0d1aSgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvbmV0L3NmL3RhdmVybmEvdDIvd29ya2JlbmNoL3VpL2NyZWRlbnRpYWxtYW5hZ2VyL0NyeXB0b0ZpbGVGaWx0ZXIuamF2YSBiL3NyYy9tYWluL2phdmEvbmV0L3NmL3RhdmVybmEvdDIvd29ya2JlbmNoL3VpL2NyZWRlbnRpYWxtYW5hZ2VyL0NyeXB0b0ZpbGVGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjQ5ODY4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9uZXQvc2YvdGF2ZXJuYS90Mi93b3JrYmVuY2gvdWkvY3JlZGVudGlhbG1hbmFnZXIvQ3J5cHRvRmlsZUZpbHRlci5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIFVuaXZlcnNpdHkgb2YgTWFuY2hlc3RlciAgIAorICogCisgKiAgTW9kaWZpY2F0aW9ucyB0byB0aGUgaW5pdGlhbCBjb2RlIGJhc2UgYXJlIGNvcHlyaWdodCBvZiB0aGVpcgorICogIHJlc3BlY3RpdmUgYXV0aG9ycywgb3IgdGhlaXIgZW1wbG95ZXJzIGFzIGFwcHJvcHJpYXRlLgorICogCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAgIAorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogICAgCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBuZXQuc2YudGF2ZXJuYS50Mi53b3JrYmVuY2gudWkuY3JlZGVudGlhbG1hbmFnZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKKy8qKgorICogRmlsZSBmaWx0ZXIgZm9yIGZpbHRlcmluZyBhZ2FpbnN0IHZhcmlvdXMgZmlsZSBleHRlbnNpb25zLgorICogCisgKiBAYXV0aG9yIEFsZXhhbmRyYSBOZW5hZGljCisgKi8KK3B1YmxpYyBjbGFzcyBDcnlwdG9GaWxlRmlsdGVyIGV4dGVuZHMgamF2YXguc3dpbmcuZmlsZWNob29zZXIuRmlsZUZpbHRlciAKK3sKKwkvKiogRGVzY3JpcHRpb24gb2YgdGhlIGZpbHRlciAqLworCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOworCQorCS8qKiBBcnJheSBvZiBmaWxlIGV4dGVuc2lvbnMgdG8gZmlsdGVyIGFnYWluc3QgKi8KKwlwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IGV4dHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBDcnlwdG9GaWxlRmlsdGVyIGZvciBhIHNldCBvZiByZWxhdGVkIGZpbGUgZXh0ZW5zaW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleHRMaXN0IEFycmF5IG9mIGZpbGUgZXh0ZW5zaW9ucworICAgICAqIEBwYXJhbSBzRGVzY3JpcHRpb24gU2hvcnQgY29sbGVjdGl2ZSBkZXNjcmlwdGlvbiBmb3IgdGhlIGZpbGUgZXh0ZW5zaW9ucworICAgICAqLworICAgIHB1YmxpYyBDcnlwdG9GaWxlRmlsdGVyKFN0cmluZyBbXSBleHRMaXN0LCBTdHJpbmcgc0Rlc2NyaXB0aW9uKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRMaXN0Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBhZGRUeXBlIChleHRMaXN0W2ldKTsKKyAgICAgICAgfQorICAgICAgICBkZXNjcmlwdGlvbiA9IHNEZXNjcmlwdGlvbjsKKyAgICB9CisKKwlwcml2YXRlIHZvaWQgYWRkVHlwZShTdHJpbmcgcykgeworCQlleHRzLmFkZChzKTsKKwl9CisKKwkvKiogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGZpbGUgaXMgYWNjZXB0ZWQgYnkgdGhpcyBmaWx0ZXIuICovCisJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZikgCisJeworCQkvLyBMaXR0bGUgdHJpY2s6IGlmIHlvdSBkb24ndCBkbyB0aGlzLCBvbmx5IGRpcmVjdG9yeSBuYW1lcworCQkvLyBlbmRpbmcgaW4gb25lIG9mIHRoZSBleHRlbnRpb25zIGFwcGVhciBpbiB0aGUgd2luZG93LgorCQlpZiAoZi5pc0RpcmVjdG9yeSgpKSAKKwkgICAgeworCSAgICAJcmV0dXJuIHRydWU7CisJICAgIH0gCisJICAgIGVsc2UgaWYgKGYuaXNGaWxlKCkpIAorCSAgICB7CisJICAgIAlJdGVyYXRvcjxTdHJpbmc+IGl0ID0gZXh0cy5pdGVyYXRvcigpOworCSAgICAJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCSAgICAgICAgaWYgKGYuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoKFN0cmluZykgaXQubmV4dCgpKSkKKwkgICAgICAgIAlyZXR1cm4gdHJ1ZTsKKwkgICAgCX0KKwkgICAgfQorCSAgICAvLyBBIGZpbGUgdGhhdCBkaWRuJ3QgbWF0Y2guCisJICAgIHJldHVybiBmYWxzZTsKKwkgIH0KKworCSAgLyoqIFNldCB0aGUgcHJpbnRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoaXMgZmlsdGVyLiAqLworCSAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHMpIHsKKwkgICAgZGVzY3JpcHRpb24gPSBzOworCSAgfQorCisJICAvKiogUmV0dXJuIHRoZSBwcmludGFibGUgZGVzY3JpcHRpb24gb2YgdGhpcyBmaWx0ZXIuICovCisJICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworCSAgICByZXR1cm4gZGVzY3JpcHRpb247CisJICB9CisJfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9uZXQvc2YvdGF2ZXJuYS90Mi93b3JrYmVuY2gvdWkvY3JlZGVudGlhbG1hbmFnZXIvRWRpdEtleVBhaXJFbnRyeURpYWxvZy5qYXZhIGIvc3JjL21haW4vamF2YS9uZXQvc2YvdGF2ZXJuYS90Mi93b3JrYmVuY2gvdWkvY3JlZGVudGlhbG1hbmFnZXIvRWRpdEtleVBhaXJFbnRyeURpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNzJhMzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL25ldC9zZi90YXZlcm5hL3QyL3dvcmtiZW5jaC91aS9jcmVkZW50aWFsbWFuYWdlci9FZGl0S2V5UGFpckVudHJ5RGlhbG9nLmphdmEKQEAgLTAsMCArMSwzNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIFVuaXZlcnNpdHkgb2YgTWFuY2hlc3RlciAgIAorICogCisgKiAgTW9kaWZpY2F0aW9ucyB0byB0aGUgaW5pdGlhbCBjb2RlIGJhc2UgYXJlIGNvcHlyaWdodCBvZiB0aGVpcgorICogIHJlc3BlY3RpdmUgYXV0aG9ycywgb3IgdGhlaXIgZW1wbG95ZXJzIGFzIGFwcHJvcHJpYXRlLgorICogCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAgIAorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogICAgCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBuZXQuc2YudGF2ZXJuYS50Mi53b3JrYmVuY2gudWkuY3JlZGVudGlhbG1hbmFnZXI7CisKK2ltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7CitpbXBvcnQgamF2YS5hd3QuRmxvd0xheW91dDsKK2ltcG9ydCBqYXZhLmF3dC5Gb250OworaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OworaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOworaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0FkYXB0ZXI7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQ7CisKK2ltcG9ydCBqYXZheC5zd2luZy5EZWZhdWx0TGlzdE1vZGVsOworaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247CitpbXBvcnQgamF2YXguc3dpbmcuSkRpYWxvZzsKK2ltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7CitpbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOworaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OworaW1wb3J0IGphdmF4LnN3aW5nLkpPcHRpb25QYW5lOworaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKK2ltcG9ydCBqYXZheC5zd2luZy5KU2Nyb2xsUGFuZTsKK2ltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuQ29tcG91bmRCb3JkZXI7CitpbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkVtcHR5Qm9yZGVyOworaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5FdGNoZWRCb3JkZXI7CitpbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdFNlbGVjdGlvbkV2ZW50OworaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lkxpc3RTZWxlY3Rpb25MaXN0ZW5lcjsKKworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOworCitpbXBvcnQgbmV0LnNmLnRhdmVybmEudDIuc2VjdXJpdHkuY3JlZGVudGlhbG1hbmFnZXIuQ01FeGNlcHRpb247CitpbXBvcnQgbmV0LnNmLnRhdmVybmEudDIuc2VjdXJpdHkuY3JlZGVudGlhbG1hbmFnZXIuQ3JlZGVudGlhbE1hbmFnZXI7CitpbXBvcnQgbmV0LnNmLnRhdmVybmEudDIud29ya2JlbmNoLnVpLmNyZWRlbnRpYWxtYW5hZ2VyLkdldFNlcnZpY2VVUkxEaWFsb2c7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLmF3dC5EaW1lbnNpb247CisKKy8qKgorICogRGlhbG9nIHVzZWQgZm9yIGVkaXRpbmcgc2VydmljZSB1cmxzIGFzc29jaWF0ZWQgd2l0aCBhIGtleSBwYWlyIGVudHJ5LgorICogCisgKiBAYXV0aG9yIEFsZXggTmVuYWRpYworICovCitAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKK3B1YmxpYyBjbGFzcyBFZGl0S2V5UGFpckVudHJ5RGlhbG9nCisgICAgZXh0ZW5kcyBKRGlhbG9nCit7CisKKwkvLyBTZXJ2aWNlIFVSTHMgZW50cnkgbGlzdCAKKyAgICBwcml2YXRlIEpMaXN0IGpsdFNlcnZpY2VVUkxzOworCisgICAgLy8gU3RvcmVzIHNlcnZpY2UgVVJMcyBlbnRlcmVkIAorICAgIHByaXZhdGUgQXJyYXlMaXN0PFN0cmluZz4gc2VydmljZVVSTHM7CisKKwlwcml2YXRlIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEVkaXRLZXlQYWlyRW50cnlEaWFsb2cuY2xhc3MpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBuZXcgRWRpdEtleVBhaXJFbnRyeURpYWxvZyBkaWFsb2cgd2hlcmUgdGhlIHBhcmVudCBpcyBhIGZyYW1lLgorICAgICAqLworICAgIHB1YmxpYyBFZGl0S2V5UGFpckVudHJ5RGlhbG9nKEpGcmFtZSBwYXJlbnQsIFN0cmluZyB0aXRsZSwgYm9vbGVhbiBtb2RhbCwgQXJyYXlMaXN0PFN0cmluZz4gc2VydmljZVVSTHMpCisgICAgeworICAgICAgICBzdXBlcihwYXJlbnQsIHRpdGxlLCBtb2RhbCk7CisgICAgICAgIHRoaXMuc2VydmljZVVSTHMgPSBzZXJ2aWNlVVJMczsKKyAgICAgICAgaW5pdENvbXBvbmVudHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIG5ldyBFZGl0S2V5UGFpckVudHJ5RGlhbG9nIGRpYWxvZyB3aGVyZSB0aGUgcGFyZW50IGlzIGEgZGlhbG9nLgorICAgICAqLworICAgIHB1YmxpYyBFZGl0S2V5UGFpckVudHJ5RGlhbG9nKEpEaWFsb2cgcGFyZW50LCBTdHJpbmcgdGl0bGUsIGJvb2xlYW4gbW9kYWwsIEFycmF5TGlzdDxTdHJpbmc+IHNlcnZpY2VVUkxzKQorICAgIHsKKyAgICAgICAgc3VwZXIocGFyZW50LCB0aXRsZSwgbW9kYWwpOworICAgICAgICB0aGlzLnNlcnZpY2VVUkxzID0gc2VydmljZVVSTHM7CisgICAgICAgIGluaXRDb21wb25lbnRzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzZXJ2aWNlIFVSTHMgc2V0IGluIHRoZSBkaWFsb2cuCisgICAgICovCisgICAgcHVibGljIEFycmF5TGlzdDxTdHJpbmc+IGdldFNlcnZpY2VVUkxzKCkKKyAgICB7CisgICAgICAgICAgcmV0dXJuIHNlcnZpY2VVUkxzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpc2UgdGhlIGRpYWxvZydzIEdVSSBjb21wb25lbnRzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbml0Q29tcG9uZW50cygpCisgICAgeworICAgICAgICBnZXRDb250ZW50UGFuZSgpLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOworICAgICAgICAKKyAgICAgICAgLy8gTGFiZWwKKyAgICAgICAgSkxhYmVsIGpsU2VydmljZVVSTHMgPSBuZXcgSkxhYmVsKCJTZXJ2aWNlIFVSTHMgdGhpcyBrZXkgcGFpciB3aWxsIGJlIHVzZWQgZm9yOiIpOyAgICAgICAgICAgICAKKyAgICAgICAgamxTZXJ2aWNlVVJMcy5zZXRGb250KG5ldyBGb250KG51bGwsIEZvbnQuUExBSU4sIDExKSk7CisgICAgICAgIGpsU2VydmljZVVSTHMuc2V0Qm9yZGVyKG5ldyBFbXB0eUJvcmRlcig1LDUsNSw1KSk7ICAgCisgICAgICAgIAorICAgICAgICAvLyBTZXJ2aWNlIFVSTHMgbGlzdAorICAgICAgICBEZWZhdWx0TGlzdE1vZGVsIGpsdE1vZGVsID0gbmV3IERlZmF1bHRMaXN0TW9kZWwoKTsKKyAgICAgICAgamx0U2VydmljZVVSTHMgPSBuZXcgSkxpc3Qoamx0TW9kZWwpOyAKKyAgICAgICAgLy8gUG9wdWxhdGUgdGhlIGxpc3Qgd2l0aCBjdXJyZW50IHZhbHVlcworICAgICAgICBmb3IgKFN0cmluZyB1cmwgOiBzZXJ2aWNlVVJMcyl7CisgICAgICAgIAlqbHRNb2RlbC5hZGRFbGVtZW50KHVybCk7CisgICAgICAgIH0KKyAgICAgICAgamx0U2VydmljZVVSTHMuc2V0VmlzaWJsZVJvd0NvdW50KDUpOyAvL2Rvbid0IHNob3cgbW9yZSB0aGFuIDUsIG90aGVyd2lzZSB0aGUgd2luZG93IGlzIHRvbyBiaWcKKyAgICAgICAgCisgICAgICAgIC8vICdBZGQnIHNlcnZpY2UgVVJMIGJ1dHRvbgorICAgICAgICBKQnV0dG9uIGFkZEJ1dHRvbiA9IG5ldyBKQnV0dG9uKCIrIik7CisgICAgICAgIGFkZEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKXsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJYWRkU2VydmljZVVSTFByZXNzZWQoKTsKKyAgICAgICAgICAgIH0gICAgICAgCQorICAgICAgICB9KTsKKyAgICAgICAgYWRkQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgIC8vICdSZW1vdmUnIHNlcnZpY2UgVVJMIGJ1dHRvbgorICAgICAgICBmaW5hbCBKQnV0dG9uIHJlbW92ZUJ1dHRvbiA9IG5ldyBKQnV0dG9uKCItIik7CisgICAgICAgIHJlbW92ZUJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKXsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJLy8gZ2V0IHNlbGVjdGVkIGluZGljZXMKKyAgICAgICAgICAgIAlpbnRbXSBzZWxlY3RlZCA9IGpsdFNlcnZpY2VVUkxzLmdldFNlbGVjdGVkSW5kaWNlcygpOworICAgICAgICAgICAgCWZvciAoaW50IGkgPSBzZWxlY3RlZC5sZW5ndGggLTE7IGk+PTAgOyBpLS0peworICAgICAgICAgICAgCQkgKChEZWZhdWx0TGlzdE1vZGVsKSBqbHRTZXJ2aWNlVVJMcy5nZXRNb2RlbCgpKS5yZW1vdmUoc2VsZWN0ZWRbaV0pOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIH0gICAgICAgCQorICAgICAgICB9KTsKKyAgICAgICAgcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICBqbHRTZXJ2aWNlVVJMcy5hZGRMaXN0U2VsZWN0aW9uTGlzdGVuZXIobmV3IExpc3RTZWxlY3Rpb25MaXN0ZW5lcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZChMaXN0U2VsZWN0aW9uRXZlbnQgZXZ0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChqbHRTZXJ2aWNlVVJMcy5nZXRTZWxlY3RlZEluZGV4KCkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgCisgICAgICAgIC8vIFNjcm9sbCBwYW5lIGZvciBzZXJ2aWNlIFVSTHMgbGlzdAorICAgICAgICBKU2Nyb2xsUGFuZSBqc3BTZXJ2aWNlVVJMcyA9IG5ldyBKU2Nyb2xsUGFuZShqbHRTZXJ2aWNlVVJMcywKKyAgICAgICAgICAgICAgICBKU2Nyb2xsUGFuZS5WRVJUSUNBTF9TQ1JPTExCQVJfQVNfTkVFREVELAorICAgICAgICAgICAgICAgIEpTY3JvbGxQYW5lLkhPUklaT05UQUxfU0NST0xMQkFSX0FTX05FRURFRCk7CisgICAgICAgIGpzcFNlcnZpY2VVUkxzLmdldFZpZXdwb3J0KCkuc2V0QmFja2dyb3VuZChqbHRTZXJ2aWNlVVJMcy5nZXRCYWNrZ3JvdW5kKCkpOworICAgICAgICAKKyAgICAgICAgLy8gUGFuZWwgZm9yIEFkZCBhbmQgUmVtb3ZlIGJ1dHRvbnMKKyAgICAgICAgSlBhbmVsIGpwU2VydmljZVVSTHNCdXR0b25zID0gbmV3IEpQYW5lbChuZXcgRmxvd0xheW91dChGbG93TGF5b3V0LkNFTlRFUikpOworICAgICAgICBqcFNlcnZpY2VVUkxzQnV0dG9ucy5hZGQoYWRkQnV0dG9uKTsKKyAgICAgICAganBTZXJ2aWNlVVJMc0J1dHRvbnMuYWRkKHJlbW92ZUJ1dHRvbik7CisgICAgICAgIAorICAgICAgICAvLyBQYW5lbCB0byBob2xkIHRoZSBsaXN0IHNjcm9sbCBwYW5lIGFuZCBBZGQvUmVtb3ZlIGJ1dHRvbnMgcGFuZWwKKyAgICAgICAgSlBhbmVsIGpwU2VydmljZVVSTHMgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7CisgICAgICAgIGpwU2VydmljZVVSTHMuYWRkKGpsU2VydmljZVVSTHMsIEJvcmRlckxheW91dC5OT1JUSCk7CisgICAgICAgIGpwU2VydmljZVVSTHMuYWRkKGpzcFNlcnZpY2VVUkxzLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKyAgICAgICAganBTZXJ2aWNlVVJMcy5hZGQoanBTZXJ2aWNlVVJMc0J1dHRvbnMsIEJvcmRlckxheW91dC5TT1VUSCk7CisgICAgICAgIGpwU2VydmljZVVSTHMuc2V0Qm9yZGVyKG5ldyBDb21wb3VuZEJvcmRlcigKKyAgICAgICAgICAgICAgICBuZXcgRW1wdHlCb3JkZXIoMTUsIDE1LCAxNSwgMTUpLCBuZXcgRXRjaGVkQm9yZGVyKCkpKTsKKyAgICAgICAganBTZXJ2aWNlVVJMcy5zZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24oMzAwLCAyNTApKTsKKyAgICAgICAgCisgICAgICAgIC8vIE9LIGJ1dHRvbgorICAgICAgICBKQnV0dG9uIGpiT0sgPSBuZXcgSkJ1dHRvbigiT0siKTsKKyAgICAgICAgamJPSy5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZ0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9rUHJlc3NlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICAvLyBDYW5jZWwgYnV0b24KKyAgICAgICAgSkJ1dHRvbiBqYkNhbmNlbCA9IG5ldyBKQnV0dG9uKCJDYW5jZWwiKTsKKyAgICAgICAgamJDYW5jZWwuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYW5jZWxQcmVzc2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIC8vIFBhbmVsIGZvciBPSyBhbmQgQ2FuY2VsIGJ1dHRvbnMKKyAgICAgICAgSlBhbmVsIGpwQnV0dG9ucyA9IG5ldyBKUGFuZWwobmV3IEZsb3dMYXlvdXQoRmxvd0xheW91dC5DRU5URVIpKTsKKyAgICAgICAganBCdXR0b25zLmFkZChqYk9LKTsKKyAgICAgICAganBCdXR0b25zLmFkZChqYkNhbmNlbCk7CisKKyAgICAgICAgZ2V0Q29udGVudFBhbmUoKS5hZGQoanBTZXJ2aWNlVVJMcywgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisgICAgICAgIGdldENvbnRlbnRQYW5lKCkuYWRkKGpwQnV0dG9ucywgQm9yZGVyTGF5b3V0LlNPVVRIKTsKKworICAgICAgICBhZGRXaW5kb3dMaXN0ZW5lcihuZXcgV2luZG93QWRhcHRlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZXZ0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsb3NlRGlhbG9nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIHNldFJlc2l6YWJsZShmYWxzZSk7CisKKyAgICAgICAgZ2V0Um9vdFBhbmUoKS5zZXREZWZhdWx0QnV0dG9uKGpiT0spOworCisgICAgICAgIHBhY2soKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPSyBidXR0b24gcHJlc3NlZCBvciBvdGhlcndpc2UgYWN0aXZhdGVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBva1ByZXNzZWQoKQorICAgIHsKKyAgICAJLy8gR2V0IFNlcnZpY2UgVVJMcworICAgIAlzZXJ2aWNlVVJMcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgIAlFbnVtZXJhdGlvbjw/PiBVUkxzID0gKCgoRGVmYXVsdExpc3RNb2RlbCkgamx0U2VydmljZVVSTHMuZ2V0TW9kZWwoKSkuZWxlbWVudHMoKSk7CisgICAgCSBmb3IoIDsgVVJMcy5oYXNNb3JlRWxlbWVudHMoKTsgKXsKKyAgICAJCSBzZXJ2aWNlVVJMcy5hZGQoKFN0cmluZykgVVJMcy5uZXh0RWxlbWVudCgpKTsKKyAgICAJIH0KKyAgICAgICAgY2xvc2VEaWFsb2coKTsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogQWRkIFNlcnZpY2UgVVJMIGJ1dHRvbiBwcmVzc2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFNlcnZpY2VVUkxQcmVzc2VkKCl7CisgICAgCQorICAgIAkvLyBEaXNwbGF5IHRoZSBkaWFsb2cgZm9yIGVudGVyaW5nIHNlcnZpY2UgVVJMCisgICAgCUdldFNlcnZpY2VVUkxEaWFsb2cgZEdldFNlcnZpY2VVUkwgPSBuZXcgR2V0U2VydmljZVVSTERpYWxvZyh0aGlzLCB0cnVlKTsKKyAgICAgICAgCisgICAgCWRHZXRTZXJ2aWNlVVJMLnNldExvY2F0aW9uUmVsYXRpdmVUbyh0aGlzKTsKKyAgICAJZEdldFNlcnZpY2VVUkwuc2V0VmlzaWJsZSh0cnVlKTsKKyAgICAJCisgICAgICAgIFN0cmluZyBzVVJMID0gZEdldFNlcnZpY2VVUkwuZ2V0U2VydmljZVVSTCgpOworICAgICAgICAKKyAgICAgICAgaWYgKHNVUkwgPT0gbnVsbCl7IC8vIHVzZXIgY2FuY2VsbGVkCisgICAgICAgIAlyZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChzVVJMLmxlbmd0aCgpID09IDApeyAvLyB1c2VyIGVudGVyZWQgZW1wdHkgVVJMCisgICAgICAgCQkvLyBXYXJuIHRoZSB1c2VyCisgICAgICAgIAlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZygKKyAgICAgICAgICAgIAkJdGhpcywgCisgICAgICAgICAgICAJCSJUaGUgVVJMIGNhbm5vdCBiZSBlbXB0eSIsCisgICAgICAgIAkJCSJDcmVkZW50aWFsIE1hbmFnZXIgQWxlcnQiLAorICAgICAgICAJCQlKT3B0aW9uUGFuZS5JTkZPUk1BVElPTl9NRVNTQUdFKTsKKyAgICAgICAgCXJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAJLy8gQ2hlY2sgaWYgdGhlIGVudGVyZWQgVVJMIGFscmVhZHkgZXhpc3QgaW4gdGhlIFVSTCBsaXN0IGZvciB0aGlzIGtleSBlbnRyeQorICAgIAlpZiAoKChEZWZhdWx0TGlzdE1vZGVsKSBqbHRTZXJ2aWNlVVJMcy5nZXRNb2RlbCgpKS5jb250YWlucyhzVVJMKSl7CisKKyAgICAJCS8vIFdhcm4gdGhlIHVzZXIKKyAgICAgICAgCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKAorICAgICAgICAgICAgCQl0aGlzLCAKKyAgICAgICAgICAgIAkJIlRoZSBlbnRlcmVkIFVSTCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgbGlzdCBvZiBVUkxzIGZvciB0aGlzIGtleSBwYWlyIGVudHJ5IiwKKyAgICAgICAgCQkJIkNyZWRlbnRpYWwgTWFuYWdlciBBbGVydCIsCisgICAgICAgIAkJCUpPcHRpb25QYW5lLklORk9STUFUSU9OX01FU1NBR0UpOworICAgICAgICAJcmV0dXJuOworICAgIAl9CisJCQorCQkvLyBDaGVjayBpZiB0aGUgZW50ZXJlZCBVUkwgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggYW5vdGhlciBrZXkgcGFpciBlbnRyeSBpbiB0aGUgS2V5c3RvcmUKKyAgICAJLy8gVGhpcyBjaGVjayBzaG91bGQgZXhjbHVkZSB0aGUgY3VycmVudCBlbnRyeSBmcm9tIHRoZSBtYXAgb2YgVVJMcyBiZWluZyBzZWFyY2hlZAorICAgIAkvLyByZWFsbHkgKHdlJ3ZlIGFscmVhZHkgY2hlY2tlZCBmb3IgaXQgaW4gdGhlIGpsdFNlcnZpY2VVUkxzKSAtIGJ1dCBkb2VzIG5vdCByZWFsbHkgbWF0dGVyIGFueXdheQorICAgIAkKKyAgICAJQ3JlZGVudGlhbE1hbmFnZXIgY3JlZE1hbmFnZXIgPSBudWxsOworICAgIAl0cnkgeworCQkJY3JlZE1hbmFnZXIgPSBDcmVkZW50aWFsTWFuYWdlci5nZXRJbnN0YW5jZSgpOworCQl9IGNhdGNoIChDTUV4Y2VwdGlvbiBjbWUpIHsKKwkJCS8vIEZhaWxlZCB0byBpbnN0YW50aWF0ZSBDcmVkZW50aWFsIE1hbmFnZXIgLSB3YXJuIHRoZSB1c2VyIGFuZCBleGl0CisJCQlTdHJpbmcgZXhNZXNzYWdlID0gIkZhaWxlZCB0byBpbnN0YW50aWF0ZSBDcmVkZW50aWFsIE1hbmFnZXIiOworCQkJbG9nZ2VyIC5lcnJvcihleE1lc3NhZ2UsIGNtZSk7CisJCQljbWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhuZXcgSkZyYW1lKCksIGV4TWVzc2FnZSwKKwkJCQkJIkNyZWRlbnRpYWwgTWFuYWdlciBFcnJvciIsIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOworCQkJcmV0dXJuOworCQl9ICAKKwkJCisgICAgCUhhc2hNYXA8U3RyaW5nLCBBcnJheUxpc3Q8U3RyaW5nPj4gdXJsTWFwID0gY3JlZE1hbmFnZXIuZ2V0U2VydmljZVVSTHNmb3JLZXlQYWlycygpOworICAgICAgIAlpZiAodXJsTWFwICE9IG51bGwpeyAvLyBzaG91bGQgbm90IGJlIG51bGwgcmVhbGx5IChhbHRob3VnaCBjYW4gYmUgZW1wdHkpLiBDaGVjayBhbnl3YXkuCisgICAgICAgIAlTZXQ8U3RyaW5nPiBhbGlhc2VzID0gdXJsTWFwLmtleVNldCgpOworICAgICAgICAJZm9yIChJdGVyYXRvcjxTdHJpbmc+IGkgPSBhbGlhc2VzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApeworICAgICAgICAJCVN0cmluZyBhbGlhcyA9IChTdHJpbmcpIGkubmV4dCgpOworICAgICAgICAJCS8vIENoZWNrIGlmIHVybCBsaXN0IGZvciB0aGlzIGFsaWFzIGNvbnRhaW5zIHRoZSBuZXdseSBlbnRlcmVkIHVybAorICAgICAgICAJCUFycmF5TGlzdDxTdHJpbmc+IHVybHMgPSAoQXJyYXlMaXN0PFN0cmluZz4pIHVybE1hcC5nZXQoYWxpYXMpOworICAgICAgICAJCWlmICh1cmxzLmNvbnRhaW5zKHNVUkwpKXsKKyAgICAgICAgICAgIAkJLy8gV2FybiB0aGUgdXNlciBhbmQgZXhpdAorICAgICAgICAgICAgICAgIAlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZygKKyAgICAgICAgICAgICAgICAgICAgCQl0aGlzLCAKKyAgICAgICAgICAgICAgICAgICAgCQkiVGhlIGVudGVyZWQgVVJMIGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIGFub3RoZXIga2V5IHBhaXIgZW50cnkiLAorICAgICAgICAgICAgICAgIAkJCSJDcmVkZW50aWFsIE1hbmFnZXIgQWxlcnQiLAorICAgICAgICAgICAgICAgIAkJCUpPcHRpb25QYW5lLklORk9STUFUSU9OX01FU1NBR0UpOworICAgICAgICAgICAgICAgIAlyZXR1cm47CisgICAgICAgIAkJfSAgICAJCQorICAgICAgICAJIH0KKyAgICAgICAJfQorICAgIAkKKwkJLy8gQ2hlY2sgaWYgdGhlIGVudGVyZWQgVVJMIGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIGEgcGFzc3dvcmQgZW50cnkgaW4gdGhlIEtleXN0b3JlCisvLyAgICAJQXJyYXlMaXN0PFN0cmluZz4gdXJsTGlzdCA9IChBcnJheUxpc3Q8U3RyaW5nPikgKChDcmVkZW50aWFsTWFuYWdlclVJKSB0aGlzLmdldFBhcmVudCgpKS5nZXRVUkxzRm9yUGFzc3dvcmRzKCk7CisvLwkJLy8gQ2hlY2sgaWYgdGhpcyB1cmwgbGlzdCBjb250YWlucyB0aGUgbmV3bHkgZW50ZXJlZCB1cmwKKy8vCQlpZiAodXJsTGlzdC5jb250YWlucyhzVVJMKSl7CisvLyAgICAJCS8vIFdhcm4gdGhlIHVzZXIgYW5kIGV4aXQKKy8vICAgICAgICAJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2coCisvLyAgICAgICAgICAgIAkJdGhpcywgCisvLyAgICAgICAgICAgIAkJIlRoZSBlbnRlcmVkIFVSTCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCBhbm90aGVyIHBhc3N3b3JkIGVudHJ5IiwKKy8vICAgICAgICAJCQkiQ3JlZGVudGlhbCBNYW5hZ2VyIEFsZXJ0IiwKKy8vICAgICAgICAJCQlKT3B0aW9uUGFuZS5JTkZPUk1BVElPTl9NRVNTQUdFKTsKKy8vICAgICAgICAJcmV0dXJuOworLy8JCX0gICAgCQorICAgIAkKKyAgICAJLy8gT3RoZXJ3aXNlIC0gdGhlIGVudGVyZWQgVVJMIGlzIG5vdCBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBlbnRyeSBpbiB0aGUgS2V5c3RvcmUsIAorCQkvLyBzbyBhZGQgdGhpcyBVUkwgdG8gdGhlIGxpc3Qgb2YgVVJMcyBmb3IgdGhpcyBrZXkgcGFpciBlbnRyeQorICAgICAgICAoKERlZmF1bHRMaXN0TW9kZWwpIGpsdFNlcnZpY2VVUkxzLmdldE1vZGVsKCkpLmFkZEVsZW1lbnQoc1VSTCk7CisgICAgICAgIGludCBpbmRleCA9ICgoRGVmYXVsdExpc3RNb2RlbCkgamx0U2VydmljZVVSTHMuZ2V0TW9kZWwoKSkuZ2V0U2l6ZSgpIC0gMTsKKyAgICAgICAgLy8gRWxlbWVudCBpcyBhcHBlbmRlZCB0byB0aGUgbGlzdCAtIGdldCBpdHMgaW5kZXgKKyAgICAgICAgamx0U2VydmljZVVSTHMuc2V0U2VsZWN0ZWRJbmRleChpbmRleCk7CisgICAgICAgIC8vIEluc3VyZSB0aGUgbmV3bHkgYWRkZWQgVVJMIGlzIHZpc2libGUKKyAgICAgICAgamx0U2VydmljZVVSTHMuZW5zdXJlSW5kZXhJc1Zpc2libGUoaW5kZXgpOworCisgICAgfQorICAgIAorCisgICAgLyoqCisgICAgICogQ2FuY2VsIGJ1dHRvbiBwcmVzc2VkIG9yIG90aGVyd2lzZSBhY3RpdmF0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNhbmNlbFByZXNzZWQoKQorICAgIHsKKyAgICAgICAJLy8gU2V0IHNlcnZpY2VVUkxzIHRvIG51bGwgYXMgaXQgbWlnaHQgaGF2ZSBjaGFuZ2VkIGluIHRoZSBtZWFudGltZQorICAgIAkvLyBpZiB1c2VyIGVudGVyZWQgc29tZSB2YWx1ZSB0aGFuIHByZXNzZWQgY2FuY2VsIGxhdGVyIG9uCisgICAgCXNlcnZpY2VVUkxzID0gbnVsbDsgICAgICAgCisgICAgCWNsb3NlRGlhbG9nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIGRpYWxvZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2xvc2VEaWFsb2coKQorICAgIHsKKyAgICAgICAgc2V0VmlzaWJsZShmYWxzZSk7CisgICAgICAgIGRpc3Bvc2UoKTsKKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9uZXQvc2YvdGF2ZXJuYS90Mi93b3JrYmVuY2gvdWkvY3JlZGVudGlhbG1hbmFnZXIvR2V0TmV3UGFzc3dvcmREaWFsb2cuamF2YSBiL3NyYy9tYWluL2phdmEvbmV0L3NmL3RhdmVybmEvdDIvd29ya2JlbmNoL3VpL2NyZWRlbnRpYWxtYW5hZ2VyL0dldE5ld1Bhc3N3b3JkRGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I4ZjYzYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvbmV0L3NmL3RhdmVybmEvdDIvd29ya2JlbmNoL3VpL2NyZWRlbnRpYWxtYW5hZ2VyL0dldE5ld1Bhc3N3b3JkRGlhbG9nLmphdmEKQEAgLTAsMCArMSwyMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIFVuaXZlcnNpdHkgb2YgTWFuY2hlc3RlciAgIAorICogCisgKiAgTW9kaWZpY2F0aW9ucyB0byB0aGUgaW5pdGlhbCBjb2RlIGJhc2UgYXJlIGNvcHlyaWdodCBvZiB0aGVpcgorICogIHJlc3BlY3RpdmUgYXV0aG9ycywgb3IgdGhlaXIgZW1wbG95ZXJzIGFzIGFwcHJvcHJpYXRlLgorICogCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAgIAorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogICAgCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBuZXQuc2YudGF2ZXJuYS50Mi53b3JrYmVuY2gudWkuY3JlZGVudGlhbG1hbmFnZXI7CisKK2ltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7CitpbXBvcnQgamF2YS5hd3QuRmxvd0xheW91dDsKK2ltcG9ydCBqYXZhLmF3dC5Gb250OworaW1wb3J0IGphdmEuYXd0LkdyaWRMYXlvdXQ7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93QWRhcHRlcjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dFdmVudDsKKworaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247CitpbXBvcnQgamF2YXguc3dpbmcuSkRpYWxvZzsKK2ltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7CitpbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOworaW1wb3J0IGphdmF4LnN3aW5nLkpPcHRpb25QYW5lOworaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKK2ltcG9ydCBqYXZheC5zd2luZy5KUGFzc3dvcmRGaWVsZDsKK2ltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuRW1wdHlCb3JkZXI7CisKKy8qKgorICogRGlhbG9nIHVzZWQgZm9yIGVudGVyaW5nIGFuZCBjb25maXJtaW5nIGEgcGFzc3dvcmQuCisgKiAKKyAqIEBhdXRob3IgQWxleCBOZW5hZGljCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQorcHVibGljIGNsYXNzIEdldE5ld1Bhc3N3b3JkRGlhbG9nIGV4dGVuZHMgSkRpYWxvZyB7CisKKwkvLyBJbnN0cnVjdGlvbnMgZm9yIHVzZXIgZXhwbGFpbmluZyB0aGUgcHVycG9zZSBvZiB0aGUgcGFzc3dvcmQgCisJcHJpdmF0ZSBTdHJpbmcgaW5zdHJ1Y3Rpb25zID0gbnVsbDsKKwkKKyAgICAvLyBGaXJzdCBwYXNzd29yZCBlbnRyeSBwYXNzd29yZCBmaWVsZCAKKyAgICBwcml2YXRlIEpQYXNzd29yZEZpZWxkIGpwZkZpcnN0OworCisgICAgLy8gUGFzc3dvcmQgY29uZmlybWF0aW9uIGVudHJ5IHBhc3N3b3JkIGZpZWxkIAorICAgIHByaXZhdGUgSlBhc3N3b3JkRmllbGQganBmQ29uZmlybTsKKworICAgIC8vIFN0b3JlcyBuZXcgcGFzc3dvcmQgZW50ZXJlZCAKKyAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIG5ldyBHZXROZXdQYXNzd29yZERpYWxvZyB3aGVyZSB0aGUgcGFyZW50IGlzIGEgZnJhbWUuCisgICAgICovCisgICAgcHVibGljIEdldE5ld1Bhc3N3b3JkRGlhbG9nKEpGcmFtZSBwYXJlbnQsIFN0cmluZyB0aXRsZSwgYm9vbGVhbiBtb2RhbCwgU3RyaW5nIGluc3RyKQorICAgIHsKKyAgICAgICAgc3VwZXIocGFyZW50LCB0aXRsZSwgbW9kYWwpOworICAgICAgICBpbnN0cnVjdGlvbnMgPSBpbnN0cjsKKyAgICAgICAgaW5pdENvbXBvbmVudHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIG5ldyBHZXROZXdQYXNzd29yZERpYWxvZyB3aGVyZSB0aGUgcGFyZW50IGlzIGEgZGlhbG9nLgorICAgICAqLworICAgIHB1YmxpYyBHZXROZXdQYXNzd29yZERpYWxvZyhKRGlhbG9nIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBib29sZWFuIG1vZGFsLCBTdHJpbmcgaW5zdHIpCisgICAgeworICAgICAgICBzdXBlcihwYXJlbnQsIHRpdGxlLCBtb2RhbCk7CisgICAgICAgIGluc3RydWN0aW9ucyA9IGluc3RyOworICAgICAgICBpbml0Q29tcG9uZW50cygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpc2UgdGhlIGRpYWxvZydzIEdVSSBjb21wb25lbnRzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbml0Q29tcG9uZW50cygpCisgICAgeworICAgICAgICBnZXRDb250ZW50UGFuZSgpLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOworCisgICAgICAgIEpMYWJlbCBqbEZpcnN0ID0gbmV3IEpMYWJlbCgiRW50ZXIgTmV3IFBhc3N3b3JkOiIpOworICAgICAgICBKTGFiZWwgamxDb25maXJtID0gbmV3IEpMYWJlbCgiQ29uZmlybSBOZXcgUGFzc3dvcmQ6Iik7CisgICAgICAgIGpwZkZpcnN0ID0gbmV3IEpQYXNzd29yZEZpZWxkKDE1KTsKKyAgICAgICAganBmQ29uZmlybSA9IG5ldyBKUGFzc3dvcmRGaWVsZCgxNSk7CisKKyAgICAgICAgSkJ1dHRvbiBqYk9LID0gbmV3IEpCdXR0b24oIk9LIik7CisgICAgICAgIGpiT0suYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBva1ByZXNzZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgSkJ1dHRvbiBqYkNhbmNlbCA9IG5ldyBKQnV0dG9uKCJDYW5jZWwiKTsKKyAgICAgICAgamJDYW5jZWwuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYW5jZWxQcmVzc2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIEpMYWJlbCBqbEluc3RydWN0aW9uczsKKyAgICAgICAgaWYgKGluc3RydWN0aW9ucyAhPSBudWxsKXsKKyAgICAgICAgCWpsSW5zdHJ1Y3Rpb25zID0gbmV3IEpMYWJlbCAoaW5zdHJ1Y3Rpb25zKTsKKyAgICAgICAgCWpsSW5zdHJ1Y3Rpb25zLnNldEZvbnQobmV3IEZvbnQobnVsbCwgRm9udC5QTEFJTiwgMTEpKTsKKyAgICAgICAgCWpsSW5zdHJ1Y3Rpb25zLnNldEJvcmRlcihuZXcgRW1wdHlCb3JkZXIoNSw1LDUsNSkpOworICAgICAgICAJZ2V0Q29udGVudFBhbmUoKS5hZGQoamxJbnN0cnVjdGlvbnMsIEJvcmRlckxheW91dC5OT1JUSCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEpQYW5lbCBqcFBhc3N3b3JkID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgyLCAyLCA1LCA1KSk7CisgICAgICAgIGpwUGFzc3dvcmQuYWRkKGpsRmlyc3QpOworICAgICAgICBqcFBhc3N3b3JkLmFkZChqcGZGaXJzdCk7CisgICAgICAgIGpwUGFzc3dvcmQuYWRkKGpsQ29uZmlybSk7CisgICAgICAgIGpwUGFzc3dvcmQuYWRkKGpwZkNvbmZpcm0pOworICAgICAgICBqcFBhc3N3b3JkLnNldEJvcmRlcihuZXcgRW1wdHlCb3JkZXIoNSwgNSwgNSwgNSkpOworCisgICAgICAgIEpQYW5lbCBqcEJ1dHRvbnMgPSBuZXcgSlBhbmVsKG5ldyBGbG93TGF5b3V0KEZsb3dMYXlvdXQuQ0VOVEVSKSk7CisgICAgICAgIGpwQnV0dG9ucy5hZGQoamJDYW5jZWwpOworICAgICAgICBqcEJ1dHRvbnMuYWRkKGpiT0spOworCisgICAgICAgIGdldENvbnRlbnRQYW5lKCkuYWRkKGpwUGFzc3dvcmQsIEJvcmRlckxheW91dC5DRU5URVIpOworICAgICAgICBnZXRDb250ZW50UGFuZSgpLmFkZChqcEJ1dHRvbnMsIEJvcmRlckxheW91dC5TT1VUSCk7CisKKyAgICAgICAgYWRkV2luZG93TGlzdGVuZXIobmV3IFdpbmRvd0FkYXB0ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aW5kb3dDbG9zaW5nKFdpbmRvd0V2ZW50IGV2dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbG9zZURpYWxvZygpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBzZXRSZXNpemFibGUoZmFsc2UpOworCisgICAgICAgIGdldFJvb3RQYW5lKCkuc2V0RGVmYXVsdEJ1dHRvbihqYk9LKTsKKworICAgICAgICBwYWNrKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHBhc3N3b3JkIHNldCBpbiB0aGUgZGlhbG9nIG9yIG51bGwgaWYgbm9uZSB3YXMgc2V0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKQorICAgIHsKKyAgICAJcmV0dXJuIHBhc3N3b3JkOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDaGVjayB0aGUgZm9sbG93aW5nOgorICAgICAqIDx1bD4KKyAgICAgKiAgICAgPGxpPnRoYXQgdGhlIHVzZXIgaGFzIHN1cHBsaWVkIGFuZCBjb25maXJtZWQgYSBwYXNzd29yZAorICAgICAqICAgICA8bGk+dGhhdCB0aGUgcGFzc3dvcmQncyBtYXRjaAorICAgICAqICAgICA8bGk+dGhhdCB0aGUgcGFzc3dvcmRzIGFyZSBub3QgZW1wdHkKKyAgICAgKiA8L3VsPgorICAgICAqIGFuZCBzdG9yZSB0aGUgbmV3IHBhc3N3b3JkLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgdXNlcidzIGRpYWxvZyBlbnRyeSBtYXRjaGVzIHRoZSBhYm92ZSBjcml0ZXJpYSwKKyAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja1Bhc3N3b3JkKCkKKyAgICB7CisgICAgICAgIFN0cmluZyBzRmlyc3RQYXNzd29yZCA9IG5ldyBTdHJpbmcoanBmRmlyc3QuZ2V0UGFzc3dvcmQoKSk7CisgICAgICAgIFN0cmluZyBzQ29uZmlybVBhc3N3b3JkID0gbmV3IFN0cmluZyhqcGZDb25maXJtLmdldFBhc3N3b3JkKCkpOworCisgICAgICAgIGlmICgoc0ZpcnN0UGFzc3dvcmQuZXF1YWxzKHNDb25maXJtUGFzc3dvcmQpKSAmJiAoc0ZpcnN0UGFzc3dvcmQubGVuZ3RoKCkhPSAwKSkgeyAvL3Bhc3N3b3JkcyBtYXRjaCBhbmQgbm90IGVtcHR5CisgICAgICAgICAgICBwYXNzd29yZCA9IHNGaXJzdFBhc3N3b3JkOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKHNGaXJzdFBhc3N3b3JkLmVxdWFscyhzQ29uZmlybVBhc3N3b3JkKSkgJiYgKHNGaXJzdFBhc3N3b3JkLmxlbmd0aCgpID09IDApKSB7IC8vcGFzc3dvcmRzIG1hdGNoIGJ1dCBhcmUgZW1wdHkKKyAgICAgICAgICAgIEpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsCisgICAgICAgICAgICAgICAgICAgICJUaGUgcGFzc3dvcmQgY2Fubm90IGJlIGVtcHR5IiwgCisgICAgICAgICAgICAgICAgICAgICJDcmVkZW50aWFsIE1hbmFnZXIgV2FybmluZyIsCisgICAgICAgICAgICAgICAgICAgIEpPcHRpb25QYW5lLldBUk5JTkdfTUVTU0FHRSk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZXsgLy8gcGFzc3dvcmRzIGRvIG5vdCBtYXRjaAorCisgICAgICAgCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsCisgICAgICAgCQkJIlRoZSBwYXNzd29yZHMgZG8gbm90IG1hdGNoIiwgCisgICAgICAgCQkJIkNyZWRlbnRpYWwgTWFuYWdlciBXYXJuaW5nIiwKKyAgICAgICAJCQlKT3B0aW9uUGFuZS5XQVJOSU5HX01FU1NBR0UpOworCisgICAgICAgCXJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE9LIGJ1dHRvbiBwcmVzc2VkIG9yIG90aGVyd2lzZSBhY3RpdmF0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIG9rUHJlc3NlZCgpCisgICAgeworICAgICAgICBpZiAoY2hlY2tQYXNzd29yZCgpKSB7CisgICAgICAgICAgICBjbG9zZURpYWxvZygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FuY2VsIGJ1dHRvbiBwcmVzc2VkIG9yIG90aGVyd2lzZSBhY3RpdmF0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNhbmNlbFByZXNzZWQoKQorICAgIHsKKyAgICAJLy8gU2V0IHRoZSBwYXNzd29yZCB0byBudWxsIGFzIGl0IG1pZ2h0IGhhdmUgY2hhbmdlZCBpbiB0aGUgbWVhbnRpbWUgCisgICAgCS8vIGlmIHVzZXIgZW50ZXJlZCBzb21ldGhpbmcgcHJldmlvdXNseQorICAgIAlwYXNzd29yZCA9IG51bGw7CisgICAgICAgIGNsb3NlRGlhbG9nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIGRpYWxvZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2xvc2VEaWFsb2coKQorICAgIHsKKyAgICAgICAgc2V0VmlzaWJsZShmYWxzZSk7CisgICAgICAgIGRpc3Bvc2UoKTsKKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9uZXQvc2YvdGF2ZXJuYS90Mi93b3JrYmVuY2gvdWkvY3JlZGVudGlhbG1hbmFnZXIvR2V0UGFzc3dvcmREaWFsb2cuamF2YSBiL3NyYy9tYWluL2phdmEvbmV0L3NmL3RhdmVybmEvdDIvd29ya2JlbmNoL3VpL2NyZWRlbnRpYWxtYW5hZ2VyL0dldFBhc3N3b3JkRGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYyNTg4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvbmV0L3NmL3RhdmVybmEvdDIvd29ya2JlbmNoL3VpL2NyZWRlbnRpYWxtYW5hZ2VyL0dldFBhc3N3b3JkRGlhbG9nLmphdmEKQEAgLTAsMCArMSwyMDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIFVuaXZlcnNpdHkgb2YgTWFuY2hlc3RlciAgIAorICogCisgKiAgTW9kaWZpY2F0aW9ucyB0byB0aGUgaW5pdGlhbCBjb2RlIGJhc2UgYXJlIGNvcHlyaWdodCBvZiB0aGVpcgorICogIHJlc3BlY3RpdmUgYXV0aG9ycywgb3IgdGhlaXIgZW1wbG95ZXJzIGFzIGFwcHJvcHJpYXRlLgorICogCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAgIAorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogICAgCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBuZXQuc2YudGF2ZXJuYS50Mi53b3JrYmVuY2gudWkuY3JlZGVudGlhbG1hbmFnZXI7CisKK2ltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7CitpbXBvcnQgamF2YS5hd3QuRmxvd0xheW91dDsKK2ltcG9ydCBqYXZhLmF3dC5Gb250OworaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OworaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOworaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0FkYXB0ZXI7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQ7CisKK2ltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOworaW1wb3J0IGphdmF4LnN3aW5nLkpEaWFsb2c7CitpbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOworaW1wb3J0IGphdmF4LnN3aW5nLkpMYWJlbDsKK2ltcG9ydCBqYXZheC5zd2luZy5KT3B0aW9uUGFuZTsKK2ltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7CitpbXBvcnQgamF2YXguc3dpbmcuSlBhc3N3b3JkRmllbGQ7CitpbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkVtcHR5Qm9yZGVyOworCisvKioKKyAqIERpYWxvZyB1c2VkIGZvciBlbnRlcmluZyBhIHBhc3N3b3JkLgorICogCisgKiBAYXV0aG9yIEFsZXggTmVuYWRpYworICovCitAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKK3B1YmxpYyBjbGFzcyBHZXRQYXNzd29yZERpYWxvZyBleHRlbmRzIEpEaWFsb2cgeworCisJLy8gSW5zdHJ1Y3Rpb25zIGZvciB1c2VyIGV4cGxhaW5pbmcgdGhlIHB1cnBvc2Ugb2YgdGhlIHBhc3N3b3JkIAorCXByaXZhdGUgU3RyaW5nIGluc3RydWN0aW9ucyA9IG51bGw7CisJCisgICAgLy8gUGFzc3dvcmQgZW50cnkgcGFzc3dvcmQgZmllbGQgCisgICAgcHJpdmF0ZSBKUGFzc3dvcmRGaWVsZCBqcGZQYXNzd29yZDsKKworICAgIC8vIFN0b3JlcyB0aGUgcGFzc3dvcmQgZW50ZXJlZCAKKyAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIG5ldyBHZXRQYXNzd29yZERpYWxvZyBkaWFsb2cgd2hlcmUgdGhlIHBhcmVudCBpcyBhIGZyYW1lLgorICAgICAqLworICAgIHB1YmxpYyBHZXRQYXNzd29yZERpYWxvZyhKRnJhbWUgcGFyZW50LCBTdHJpbmcgdGl0bGUsIGJvb2xlYW4gbW9kYWwsIFN0cmluZyBpbnN0cikKKyAgICB7CisgICAgICAgIHN1cGVyKHBhcmVudCwgdGl0bGUsIG1vZGFsKTsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zID0gaW5zdHI7CisgICAgICAgIGluaXRDb21wb25lbnRzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBuZXcgR2V0UGFzc3dvcmREaWFsb2cgZGlhbG9nIHdoZXJlIHRoZSBwYXJlbnQgaXMgYSBkaWFsb2cuCisgICAgICovCisgICAgcHVibGljIEdldFBhc3N3b3JkRGlhbG9nKEpEaWFsb2cgcGFyZW50LCBTdHJpbmcgdGl0bGUsIGJvb2xlYW4gbW9kYWwsIFN0cmluZyBpbnN0cikKKyAgICB7CisgICAgICAgIHN1cGVyKHBhcmVudCwgdGl0bGUsIG1vZGFsKTsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zID0gaW5zdHI7CisgICAgICAgIGluaXRDb21wb25lbnRzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwYXNzd29yZCBzZXQgaW4gdGhlIGRpYWxvZy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHBhc3N3b3JkIG9yIG51bGwgaWYgbm9uZSB3YXMgc2V0CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpCisgICAgeworICAgIAlyZXR1cm4gcGFzc3dvcmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGlzZSB0aGUgZGlhbG9nJ3MgR1VJIGNvbXBvbmVudHMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluaXRDb21wb25lbnRzKCkKKyAgICB7CisgICAgICAgIGdldENvbnRlbnRQYW5lKCkuc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7CisgICAgICAgICAgICAgICAJCisgICAgICAgIEpMYWJlbCBqbFBhc3N3b3JkID0gbmV3IEpMYWJlbCgiUGFzc3dvcmQiKTsKKyAgICAgICAganBmUGFzc3dvcmQgPSBuZXcgSlBhc3N3b3JkRmllbGQoMTUpOworCisgICAgICAgIEpCdXR0b24gamJPSyA9IG5ldyBKQnV0dG9uKCJPSyIpOworICAgICAgICBqYk9LLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb2tQcmVzc2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIEpCdXR0b24gamJDYW5jZWwgPSBuZXcgSkJ1dHRvbigiQ2FuY2VsIik7CisgICAgICAgIGpiQ2FuY2VsLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FuY2VsUHJlc3NlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICAgICAgIAorICAgICAgICBKTGFiZWwgamxJbnN0cnVjdGlvbnM7IC8vIEluc3RydWN0aW9ucworICAgICAgICBpZiAoaW5zdHJ1Y3Rpb25zICE9IG51bGwpeworICAgICAgICAJamxJbnN0cnVjdGlvbnMgPSBuZXcgSkxhYmVsIChpbnN0cnVjdGlvbnMpOworICAgICAgICAJamxJbnN0cnVjdGlvbnMuc2V0Rm9udChuZXcgRm9udChudWxsLCBGb250LlBMQUlOLCAxMSkpOworICAgICAgICAJamxJbnN0cnVjdGlvbnMuc2V0Qm9yZGVyKG5ldyBFbXB0eUJvcmRlcig1LDUsNSw1KSk7CisgICAgICAgIAlnZXRDb250ZW50UGFuZSgpLmFkZChqbEluc3RydWN0aW9ucywgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgSlBhbmVsIGpwUGFzc3dvcmQgPSBuZXcgSlBhbmVsKG5ldyBGbG93TGF5b3V0KEZsb3dMYXlvdXQuQ0VOVEVSKSk7CisgICAgICAgIGpwUGFzc3dvcmQuYWRkKGpsUGFzc3dvcmQpOworICAgICAgICBqcFBhc3N3b3JkLmFkZChqcGZQYXNzd29yZCk7CisgICAgICAgIGpwUGFzc3dvcmQuc2V0Qm9yZGVyKG5ldyBFbXB0eUJvcmRlcig1LCA1LCA1LCA1KSk7CisKKyAgICAgICAgSlBhbmVsIGpwQnV0dG9ucyA9IG5ldyBKUGFuZWwobmV3IEZsb3dMYXlvdXQoRmxvd0xheW91dC5DRU5URVIpKTsKKyAgICAgICAganBCdXR0b25zLmFkZChqYk9LKTsKKyAgICAgICAganBCdXR0b25zLmFkZChqYkNhbmNlbCk7CisKKyAgICAgICAgZ2V0Q29udGVudFBhbmUoKS5hZGQoanBQYXNzd29yZCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisgICAgICAgIGdldENvbnRlbnRQYW5lKCkuYWRkKGpwQnV0dG9ucywgQm9yZGVyTGF5b3V0LlNPVVRIKTsKKworICAgICAgICBhZGRXaW5kb3dMaXN0ZW5lcihuZXcgV2luZG93QWRhcHRlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZXZ0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsb3NlRGlhbG9nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIHNldFJlc2l6YWJsZShmYWxzZSk7CisKKyAgICAgICAgZ2V0Um9vdFBhbmUoKS5zZXREZWZhdWx0QnV0dG9uKGpiT0spOworCisgICAgICAgIHBhY2soKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayB0aGF0IHRoZSBwYXNzd29yZCBlbnRlcmVkIGlzIG5vdCBlbXB0eSBhbmQgCisgICAgICogc3RvcmUgdGhlIGVudGVyZWQgcGFzc3dvcmQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrUGFzc3dvcmQoKQorICAgIHsKKyAgICAgICAgcGFzc3dvcmQgPSBuZXcgU3RyaW5nKGpwZlBhc3N3b3JkLmdldFBhc3N3b3JkKCkpOworCisgICAgICAgIAorICAgICAgICBpZiAocGFzc3dvcmQubGVuZ3RoKCkgPT0gMCkgeyAvL3Bhc3N3b3JkIGlzIGVtcHR5ICAgICAgICAgIAorICAgICAgICAgICAgSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcywKKyAgICAgICAgICAgICAgICAgICAgIlRoZSBwYXNzd29yZCBjYW5ub3QgYmUgZW1wdHkiLCAKKyAgICAgICAgICAgICAgICAgICAgIkNyZWRlbnRpYWwgTWFuYWdlciBXYXJuaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgSk9wdGlvblBhbmUuV0FSTklOR19NRVNTQUdFKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgLy9wYXNzd29yZCBpcyBub3QgZW1wdHkKKyAgICAgICAgCXJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogT0sgYnV0dG9uIHByZXNzZWQgb3Igb3RoZXJ3aXNlIGFjdGl2YXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgb2tQcmVzc2VkKCkKKyAgICB7CisgICAgICAgIGlmIChjaGVja1Bhc3N3b3JkKCkpIHsKKyAgICAgICAgICAgIGNsb3NlRGlhbG9nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWwgYnV0dG9uIHByZXNzZWQgb3Igb3RoZXJ3aXNlIGFjdGl2YXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2FuY2VsUHJlc3NlZCgpCisgICAgeworICAgIAlwYXNzd29yZCA9IG51bGw7CisgICAgICAgIGNsb3NlRGlhbG9nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIGRpYWxvZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2xvc2VEaWFsb2coKQorICAgIHsKKyAgICAgICAgc2V0VmlzaWJsZShmYWxzZSk7CisgICAgICAgIGRpc3Bvc2UoKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvbmV0L3NmL3RhdmVybmEvdDIvd29ya2JlbmNoL3VpL2NyZWRlbnRpYWxtYW5hZ2VyL0dldFNlcnZpY2VVUkxEaWFsb2cuamF2YSBiL3NyYy9tYWluL2phdmEvbmV0L3NmL3RhdmVybmEvdDIvd29ya2JlbmNoL3VpL2NyZWRlbnRpYWxtYW5hZ2VyL0dldFNlcnZpY2VVUkxEaWFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWMxYzE0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9uZXQvc2YvdGF2ZXJuYS90Mi93b3JrYmVuY2gvdWkvY3JlZGVudGlhbG1hbmFnZXIvR2V0U2VydmljZVVSTERpYWxvZy5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBVbml2ZXJzaXR5IG9mIE1hbmNoZXN0ZXIgICAKKyAqIAorICogIE1vZGlmaWNhdGlvbnMgdG8gdGhlIGluaXRpYWwgY29kZSBiYXNlIGFyZSBjb3B5cmlnaHQgb2YgdGhlaXIKKyAqICByZXNwZWN0aXZlIGF1dGhvcnMsIG9yIHRoZWlyIGVtcGxveWVycyBhcyBhcHByb3ByaWF0ZS4KKyAqIAorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAgICAKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqICAgIAorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2UgbmV0LnNmLnRhdmVybmEudDIud29ya2JlbmNoLnVpLmNyZWRlbnRpYWxtYW5hZ2VyOworCitpbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OworaW1wb3J0IGphdmEuYXd0LkZsb3dMYXlvdXQ7CitpbXBvcnQgamF2YS5hd3QuRm9udDsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dBZGFwdGVyOworaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50OworCitpbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKK2ltcG9ydCBqYXZheC5zd2luZy5KRGlhbG9nOworaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKK2ltcG9ydCBqYXZheC5zd2luZy5KTGFiZWw7CitpbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOworaW1wb3J0IGphdmF4LnN3aW5nLkpUZXh0RmllbGQ7CitpbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkVtcHR5Qm9yZGVyOworCisvKioKKyAqIERpYWxvZyB1c2VkIGZvciBlbnRlcmluZyBhIHNlcnZpY2UgVVJMLgorICogCisgKiBAYXV0aG9yIEFsZXhhbmRyYSBOZW5hZGljCisgKi8KKworcHVibGljIGNsYXNzIEdldFNlcnZpY2VVUkxEaWFsb2cgZXh0ZW5kcyBKRGlhbG9nCit7CisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTIwMjMzNDg1Njk5NjQzMjU5NTFMOworCisJLy8gUGFzc3dvcmQgZW50cnkgcGFzc3dvcmQgZmllbGQgLworICAgIHByaXZhdGUgSlRleHRGaWVsZCBqdGZTZXJ2aWNlVVJMOworCisgICAgLy8gU3RvcmVzIHRoZSBzZXJ2aWNlIFVSTCBlbnRlcmVkIC8KKyAgICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlVVJMID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgbmV3IEdldFNlcnZpY2VVUkxEaWFsb2cgZGlhbG9nIHdoZXJlIHRoZSBwYXJlbnQgaXMgYSBmcmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgR2V0U2VydmljZVVSTERpYWxvZyhKRnJhbWUgcGFyZW50LCBib29sZWFuIG1vZGFsKQorICAgIHsKKyAgICAgICAgc3VwZXIocGFyZW50LCAiRW50ZXIgc2VydmljZSBVUkwiLCBtb2RhbCk7CisgICAgICAgIGluaXRDb21wb25lbnRzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBuZXcgR2V0U2VydmljZVVSTERpYWxvZyBkaWFsb2cgd2hlcmUgdGhlIHBhcmVudCBpcyBhIGRpYWxvZy4gICAgCisgICAgICovCisgICAgcHVibGljIEdldFNlcnZpY2VVUkxEaWFsb2coSkRpYWxvZyBwYXJlbnQsIGJvb2xlYW4gbW9kYWwpCisgICAgeworICAgICAgICBzdXBlcihwYXJlbnQsICJFbnRlciBzZXJ2aWNlIFVSTCIsIG1vZGFsKTsKKyAgICAgICAgaW5pdENvbXBvbmVudHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHNlcnZpY2UgVVJMIHNldCBpbiB0aGUgZGlhbG9nLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgc2VydmljZSBVUkwgb3IgbnVsbCBpZiBub25lIHdhcyBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VVUkwoKQorICAgIHsKKyAgICAJcmV0dXJuIHNlcnZpY2VVUkw7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGlzZSB0aGUgZGlhbG9nJ3MgR1VJIGNvbXBvbmVudHMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluaXRDb21wb25lbnRzKCkKKyAgICB7CisgICAgICAgIGdldENvbnRlbnRQYW5lKCkuc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7CisgICAgICAgICAgICAgICAJCisgICAgICAgIEpMYWJlbCBqbFNlcnZpY2VVUkwgPSBuZXcgSkxhYmVsKCJTZXJ2aWNlIFVSTCIpOworICAgICAgICBqdGZTZXJ2aWNlVVJMID0gbmV3IEpUZXh0RmllbGQoMTUpOworCisgICAgICAgIEpCdXR0b24gamJPSyA9IG5ldyBKQnV0dG9uKCJPSyIpOworICAgICAgICBqYk9LLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb2tQcmVzc2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIEpCdXR0b24gamJDYW5jZWwgPSBuZXcgSkJ1dHRvbigiQ2FuY2VsIik7CisgICAgICAgIGpiQ2FuY2VsLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FuY2VsUHJlc3NlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICAgICAgIAorICAgICAgICBKTGFiZWwgamxJbnN0cnVjdGlvbnM7IC8vIEluc3RydWN0aW9ucworICAgIAlqbEluc3RydWN0aW9ucyA9IG5ldyBKTGFiZWwgKCJFbnRlciBzZXJ2aWNlIFVSTCBmb3Iga2V5IHBhaXIiKTsKKyAgICAJamxJbnN0cnVjdGlvbnMuc2V0Rm9udChuZXcgRm9udChudWxsLCBGb250LlBMQUlOLCAxMSkpOworICAgIAlqbEluc3RydWN0aW9ucy5zZXRCb3JkZXIobmV3IEVtcHR5Qm9yZGVyKDUsNSw1LDUpKTsKKyAgICAJZ2V0Q29udGVudFBhbmUoKS5hZGQoamxJbnN0cnVjdGlvbnMsIEJvcmRlckxheW91dC5OT1JUSCk7CisgICAgICAgIAorICAgICAgICBKUGFuZWwganBTZXJ2aWNlVVJMID0gbmV3IEpQYW5lbChuZXcgRmxvd0xheW91dChGbG93TGF5b3V0LkNFTlRFUikpOworICAgICAgICBqcFNlcnZpY2VVUkwuYWRkKGpsU2VydmljZVVSTCk7CisgICAgICAgIGpwU2VydmljZVVSTC5hZGQoanRmU2VydmljZVVSTCk7CisgICAgICAgIGpwU2VydmljZVVSTC5zZXRCb3JkZXIobmV3IEVtcHR5Qm9yZGVyKDUsIDUsIDUsIDUpKTsKKworICAgICAgICBKUGFuZWwganBCdXR0b25zID0gbmV3IEpQYW5lbChuZXcgRmxvd0xheW91dChGbG93TGF5b3V0LkNFTlRFUikpOworICAgICAgICBqcEJ1dHRvbnMuYWRkKGpiT0spOworICAgICAgICBqcEJ1dHRvbnMuYWRkKGpiQ2FuY2VsKTsKKworICAgICAgICBnZXRDb250ZW50UGFuZSgpLmFkZChqcFNlcnZpY2VVUkwsIEJvcmRlckxheW91dC5DRU5URVIpOworICAgICAgICBnZXRDb250ZW50UGFuZSgpLmFkZChqcEJ1dHRvbnMsIEJvcmRlckxheW91dC5TT1VUSCk7CisKKyAgICAgICAgYWRkV2luZG93TGlzdGVuZXIobmV3IFdpbmRvd0FkYXB0ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aW5kb3dDbG9zaW5nKFdpbmRvd0V2ZW50IGV2dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbG9zZURpYWxvZygpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBzZXRSZXNpemFibGUoZmFsc2UpOworCisgICAgICAgIGdldFJvb3RQYW5lKCkuc2V0RGVmYXVsdEJ1dHRvbihqYk9LKTsKKworICAgICAgICBwYWNrKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogT0sgYnV0dG9uIHByZXNzZWQgb3Igb3RoZXJ3aXNlIGFjdGl2YXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgb2tQcmVzc2VkKCkKKyAgICB7CisgICAgCXNlcnZpY2VVUkwgPSBuZXcgU3RyaW5nKGp0ZlNlcnZpY2VVUkwuZ2V0VGV4dCgpKTsKKyAgICAJY2xvc2VEaWFsb2coKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWwgYnV0dG9uIHByZXNzZWQgb3Igb3RoZXJ3aXNlIGFjdGl2YXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2FuY2VsUHJlc3NlZCgpCisgICAgeworICAgIAlzZXJ2aWNlVVJMID0gbnVsbDsKKyAgICAgICAgY2xvc2VEaWFsb2coKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgZGlhbG9nLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjbG9zZURpYWxvZygpCisgICAgeworICAgICAgICBzZXRWaXNpYmxlKGZhbHNlKTsKKyAgICAgICAgZGlzcG9zZSgpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9uZXQvc2YvdGF2ZXJuYS90Mi93b3JrYmVuY2gvdWkvY3JlZGVudGlhbG1hbmFnZXIvS2V5UGFpcnNUYWJsZU1vZGVsLmphdmEgYi9zcmMvbWFpbi9qYXZhL25ldC9zZi90YXZlcm5hL3QyL3dvcmtiZW5jaC91aS9jcmVkZW50aWFsbWFuYWdlci9LZXlQYWlyc1RhYmxlTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Njg4NDExCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9uZXQvc2YvdGF2ZXJuYS90Mi93b3JrYmVuY2gvdWkvY3JlZGVudGlhbG1hbmFnZXIvS2V5UGFpcnNUYWJsZU1vZGVsLmphdmEKQEAgLTAsMCArMSwyMjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIFVuaXZlcnNpdHkgb2YgTWFuY2hlc3RlciAgIAorICogCisgKiAgTW9kaWZpY2F0aW9ucyB0byB0aGUgaW5pdGlhbCBjb2RlIGJhc2UgYXJlIGNvcHlyaWdodCBvZiB0aGVpcgorICogIHJlc3BlY3RpdmUgYXV0aG9ycywgb3IgdGhlaXIgZW1wbG95ZXJzIGFzIGFwcHJvcHJpYXRlLgorICogCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAgIAorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogICAgCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBuZXQuc2YudGF2ZXJuYS50Mi53b3JrYmVuY2gudWkuY3JlZGVudGlhbG1hbmFnZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOworCitpbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOworaW1wb3J0IGphdmF4LnN3aW5nLkpPcHRpb25QYW5lOworaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLkFic3RyYWN0VGFibGVNb2RlbDsKKworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOworCitpbXBvcnQgbmV0LnNmLnRhdmVybmEudDIubGFuZy5vYnNlcnZlci5PYnNlcnZhYmxlOworaW1wb3J0IG5ldC5zZi50YXZlcm5hLnQyLmxhbmcub2JzZXJ2ZXIuT2JzZXJ2ZXI7CitpbXBvcnQgbmV0LnNmLnRhdmVybmEudDIuc2VjdXJpdHkuY3JlZGVudGlhbG1hbmFnZXIuQ01FeGNlcHRpb247CitpbXBvcnQgbmV0LnNmLnRhdmVybmEudDIuc2VjdXJpdHkuY3JlZGVudGlhbG1hbmFnZXIuQ3JlZGVudGlhbE1hbmFnZXI7CitpbXBvcnQgbmV0LnNmLnRhdmVybmEudDIuc2VjdXJpdHkuY3JlZGVudGlhbG1hbmFnZXIuS2V5c3RvcmVDaGFuZ2VkRXZlbnQ7CisKKy8qKgorICogVGhlIHRhYmxlIG1vZGVsIHVzZWQgdG8gZGlzcGxheSB0aGUgS2V5c3RvcmUncyBrZXkgcGFpciBlbnRyaWVzLgorICogCisgKiBAYXV0aG9yIEFsZXggTmVuYWRpYworICovCitAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKK3B1YmxpYyBjbGFzcyBLZXlQYWlyc1RhYmxlTW9kZWwgZXh0ZW5kcyBBYnN0cmFjdFRhYmxlTW9kZWwgaW1wbGVtZW50cyBPYnNlcnZlcjxLZXlzdG9yZUNoYW5nZWRFdmVudD4geworCisJLy8gQ29sdW1uIG5hbWVzIAorICAgIHByaXZhdGUgU3RyaW5nW10gY29sdW1uTmFtZXM7CisKKyAgICAvLyBUYWJsZSBkYXRhIAorICAgIHByaXZhdGUgT2JqZWN0W11bXSBkYXRhOworICAgIAorCXByaXZhdGUgQ3JlZGVudGlhbE1hbmFnZXIgY3JlZE1hbmFnZXI7CisgICAgCisJcHJpdmF0ZSBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihLZXlQYWlyc1RhYmxlTW9kZWwuY2xhc3MpOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IEtleVBhaXJzVGFibGVNb2RlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgS2V5UGFpcnNUYWJsZU1vZGVsKCkKKyAgICB7CisgICAgICAgIGNyZWRNYW5hZ2VyID0gbnVsbDsKKyAgICAgICAgdHJ5eworICAgICAgICAJY3JlZE1hbmFnZXIgPSBDcmVkZW50aWFsTWFuYWdlci5nZXRJbnN0YW5jZSgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChDTUV4Y2VwdGlvbiBjbWUpeworCQkJLy8gRmFpbGVkIHRvIGluc3RhbnRpYXRlIENyZWRlbnRpYWwgTWFuYWdlciAtIHdhcm4gdGhlIHVzZXIgYW5kIGV4aXQKKwkJCVN0cmluZyBzTWVzc2FnZSA9ICJGYWlsZWQgdG8gaW5zdGFudGlhdGUgQ3JlZGVudGlhbCBNYW5hZ2VyLiAiICsgY21lLmdldE1lc3NhZ2UoKTsKKwkJCWxvZ2dlci5lcnJvcigiQ00gR1VJOiAiKyBzTWVzc2FnZSk7CisJCQljbWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhuZXcgSkZyYW1lKCksIHNNZXNzYWdlLAorCQkJCQkiQ3JlZGVudGlhbCBNYW5hZ2VyIEVycm9yIiwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7CisJCQlyZXR1cm47CisgICAgICAgIH0KKyAgICAJCisgICAgICAgCWRhdGEgPSBuZXcgT2JqZWN0WzBdWzBdOworICAgICAgICBjb2x1bW5OYW1lcyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgIAkiRW50cnkgVHlwZSIsIC8vIHR5cGUgb2YgdGhlIEtleXN0b3JlIGVudHJ5CisgICAgICAgIAkiT3duZXIiLCAvLyBvd25lcidzIGNvbW1vbiBuYW1lCisgICAgICAgIAkiSXNzdWVyIiwgLy8gaXNzdWVyJ3MgY29tbW9uIG5hbWUKKyAgICAgICAgCSJTZXJpYWwgTnVtYmVyIiwgLy8gcHVibGljIGtleSBjZXJ0aWZpY2F0ZSdzIHNlcmlhbCBudW1iZXIKKyAgICAgICAgCSJMYXN0IE1vZGlmaWVkIiwgLy8gbGFzdCBtb2RpZmllZCBkYXRlIG9mIHRoZSBlbnRyeQorICAgICAgICAgICAgIlVSTHMiLCAvLyB0aGUgaW52aXNpYmxlIGNvbHVtbiBob2xkaW5nIHRoZSBsaXN0IG9mIFVSTHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZW50cnkKKyAgICAgICAgICAgICJBbGlhcyIgLy8gdGhlIGludmlzaWJsZSBjb2x1bW4gaG9sZGluZyB0aGUgYWN0dWFsIGFsaWFzIGluIHRoZSBLZXlzdG9yZQorICAgICAgICAJfTsKKyAgICAgICAgCisgICAgICAgIHRyeSB7CisJCQlsb2FkKCk7CisJCX0gY2F0Y2ggKENNRXhjZXB0aW9uIGNtZSkgeworCQkJU3RyaW5nIHNNZXNzYWdlID0gIkZhaWxlZCB0byBsb2FkIGtleSBwYWlycyI7CisJCQlsb2dnZXIuZXJyb3Ioc01lc3NhZ2UpOworCQkJY21lLnByaW50U3RhY2tUcmFjZSgpOworCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2cobmV3IEpGcmFtZSgpLCBzTWVzc2FnZSwKKwkJCQkJIkNyZWRlbnRpYWwgTWFuYWdlciBFcnJvciIsIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOworCQkJcmV0dXJuOworCQl9CisJCQorICAgICAgICAvLyBTdGFydCBvYnNlcnZpbmcgY2hhbmdlcyB0byB0aGUgS2V5c3RvcmUKKyAgICAgICAgY3JlZE1hbmFnZXIuYWRkT2JzZXJ2ZXIodGhpcyk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIExvYWQgdGhlIEtleVBhaXJzVGFibGVNb2RlbCB3aXRoIHRoZSBrZXkgcGFpciBlbnRyaWVzIGZyb20gdGhlIEtleXN0b3JlLiAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2FkKCkgdGhyb3dzIENNRXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIHRyeXsKKyAgICAgICAgICAgIC8vIFBsYWNlIGtleSBwYWlyIGVudHJpZXMnIGFsaWFzZXMgaW4gYSB0cmVlIG1hcCB0byBzb3J0IHRoZW0KKyAgICAgICAgICAgIFRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+IHNvcnRlZEFsaWFzZXMgPSBuZXcgVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4oKTsgIAorICAgICAgICAgICAgCQorICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gYWxpYXNlcyA9IGNyZWRNYW5hZ2VyLmdldEFsaWFzZXMoQ3JlZGVudGlhbE1hbmFnZXIuS0VZU1RPUkUpOworICAgICAgICAgICAgCisgICAgICAgICAgIAlmb3IgKFN0cmluZyBhbGlhczogYWxpYXNlcyl7CisgICAgICAgIAkJLy8gV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBrZXkgcGFpciBlbnRyaWVzIGhlcmUuCisgICAgICAgIAkJLy8gQWxpYXMgZm9yIHN1Y2ggZW50cmllcyBpcyBjb25zdHJ1Y3RlZCBhcyAia2V5cGFpciM8Q0VSVF9TRVJJQUxfTlVNQkVSPiM8Q0VSVF9DT01NT05fTkFNRT4iIHdoZXJlCisgICAgICAgIAkJaWYgKGFsaWFzLnN0YXJ0c1dpdGgoImtleXBhaXIjIikpeworICAgICAgICAJCQlzb3J0ZWRBbGlhc2VzLnB1dChhbGlhcywgYWxpYXMpOworICAgICAgICAJCX0KKyAgICAgICAgCX0gICAJCQorICAgICAgICAJCQkKKyAgICAgICAgICAgIC8vIENyZWF0ZSBvbmUgdGFibGUgcm93IGZvciBlYWNoIGtleSBwYWlyIGVudHJ5CisgICAgICAgICAgICBkYXRhID0gbmV3IE9iamVjdFtzb3J0ZWRBbGlhc2VzLnNpemUoKV1bN107CisKKyAgICAgICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgc29ydGVkIGFsaWFzZXMgKGlmIGFueSksIHJldHJpZXZpbmcgdGhlIGtleSBwYWlyCisgICAgICAgICAgICAvLyBlbnRyaWVzIGFuZCBwb3B1bGF0aW5nIHRoZSB0YWJsZSBtb2RlbAorICAgICAgICAgICAgaW50IGlDbnQgPSAwOworICAgICAgICAgICAgZm9yIChTdHJpbmcgYWxpYXMgOiBzb3J0ZWRBbGlhc2VzLnZhbHVlcygpKQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBQb3B1bGF0ZSB0aGUgdHlwZSBjb2x1bW4gLSBpdCBpcyBzZXQgd2l0aCBhbiBpbnRlZ2VyCisgICAgICAgICAgICAgICAgLy8gYnV0IGEgY3VzdG9tIGNlbGwgcmVuZGVyZXIgd2lsbCBjYXVzZSBhIHN1aXRhYmxlIGljb24KKyAgICAgICAgICAgICAgICAvLyB0byBiZSBkaXNwbGF5ZWQKKyAgICAgICAgICAgICAgICBkYXRhW2lDbnRdWzBdID0gQ3JlZGVudGlhbE1hbmFnZXJVSS5LRVlfUEFJUl9FTlRSWV9UWVBFOworCisgICAgICAgICAgICAgICAgLy8gU3BsaXQgdGhlIGFsaWFzIHN0cmluZyB0byBleHRyYWN0IG93bmVyLCBpc3N1ZXIgYW5kIHNlcmlhbCBudW1iZXIgCisgICAgICAgICAgICAgICAgLy8gYWxpYXMgPSAia2V5cGFpciMiPENFUlRfU1VCSkVDVF9DT01NT05fTkFNRT4iIyI8Q0VSVF9JU1NVRVJfQ09NTU9OX05BTUU+IiMiPENFUlRfU0VSSUFMX05VTUJFUj4KKyAgICAgICAgICAgICAgICBTdHJpbmdbXSBhbGlhc0NvbXBvbmVudHMgPSBhbGlhcy5zcGxpdCgiIyIpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIFBvcHVsYXRlIHRoZSBvd25lciBjb2x1bW4gZXh0cmFjdGVkIGZyb20gdGhlIGFsaWFzCisgICAgICAgICAgICAgICAgZGF0YVtpQ250XVsxXSA9IGFsaWFzQ29tcG9uZW50c1sxXTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBQb3B1bGF0ZSB0aGUgaXNzdWVyIGNvbHVtbiBleHRyYWN0ZWQgZnJvbSB0aGUgYWxpYXMKKyAgICAgICAgICAgICAgICBkYXRhW2lDbnRdWzJdID0gYWxpYXNDb21wb25lbnRzWzJdOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIFBvcHVsYXRlIHRoZSBzZXJpYWwgbnVtYmVyIGNvbHVtbiBleHRyYWN0ZWQgZnJvbSB0aGUgYWxpYXMKKyAgICAgICAgICAgICAgICBkYXRhW2lDbnRdWzNdID0gYWxpYXNDb21wb25lbnRzWzNdOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIFBvcHVsYXRlIHRoZSBtb2RpZmllZCBkYXRlIGNvbHVtbiAoIlVCRVIiIGtleXN0b3JlIHR5cGUgc3VwcG9ydHMgY3JlYXRpb24gZGF0ZSkKKyAgICAgICAgICAgICAgIAlkYXRhW2lDbnRdWzRdID0gY3JlZE1hbmFnZXIuZ2V0RW50cnlDcmVhdGlvbkRhdGUoQ3JlZGVudGlhbE1hbmFnZXIuS0VZU1RPUkUsIGFsaWFzKTsKKworICAgICAgICAgICAgICAgIC8vIFBvcHVsYXRlIHRoZSBpbnZpc2libGUgVVJMcyBsaXN0IGNvbHVtbgorICAgICAgICAgICAgICAgIGRhdGFbaUNudF1bNV0gPSBjcmVkTWFuYWdlci5nZXRTZXJ2aWNlVVJMc0ZvcktleVBhaXIoYWxpYXMpOyAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIFBvcHVsYXRlIHRoZSBpbnZpc2libGUgYWxpYXMgY29sdW1uCisgICAgICAgICAgICAgICAgZGF0YVtpQ250XVs2XSA9IGFsaWFzOyAgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaUNudCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChDTUV4Y2VwdGlvbiBjbWUpeworICAgICAgICAgICAgdGhyb3cgKGNtZSk7CisgICAgICAgIH0KKworICAgICAgICBmaXJlVGFibGVEYXRhQ2hhbmdlZCgpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSB0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldENvbHVtbkNvdW50KCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb2x1bW5OYW1lcy5sZW5ndGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgdGFibGUuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRSb3dDb3VudCgpCisgICAgeworICAgICAgICByZXR1cm4gZGF0YS5sZW5ndGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gYXQgdGhlIGdpdmVuIHBvc2l0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uTmFtZShpbnQgaUNvbCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb2x1bW5OYW1lc1tpQ29sXTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNlbGwgdmFsdWUgYXQgdGhlIGdpdmVuIHJvdyBhbmQgY29sdW1uIHBvc2l0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWVBdChpbnQgaVJvdywgaW50IGlDb2wpCisgICAgeworICAgICAgICByZXR1cm4gZGF0YVtpUm93XVtpQ29sXTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNsYXNzIGF0IG9mIHRoZSBjZWxscyBhdCB0aGUgZ2l2ZW4gY29sdW1uIHBvc2l0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzczw/IGV4dGVuZHMgT2JqZWN0PiBnZXRDb2x1bW5DbGFzcyhpbnQgaUNvbCkKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRWYWx1ZUF0KDAsIGlDb2wpLmdldENsYXNzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXMgdGhlIGNlbGwgYXQgdGhlIGdpdmVuIHJvdyBhbmQgY29sdW1uIHBvc2l0aW9uIGVkaXRhYmxlPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ2VsbEVkaXRhYmxlKGludCBpUm93LCBpbnQgaUNvbCkKKyAgICB7CisgICAgICAgIC8vIFRoZSB0YWJsZSBpcyBhbHdheXMgcmVhZC1vbmx5CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKwlwdWJsaWMgdm9pZCBub3RpZnkoT2JzZXJ2YWJsZTxLZXlzdG9yZUNoYW5nZWRFdmVudD4gc2VuZGVyLAorCQkJS2V5c3RvcmVDaGFuZ2VkRXZlbnQgbWVzc2FnZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJLy8gcmVsb2FkIHRoZSB0YWJsZQorCQlpZiAobWVzc2FnZS5rZXlzdG9yZVR5cGUuZXF1YWxzKENyZWRlbnRpYWxNYW5hZ2VyLktFWVNUT1JFKSl7CisJCQlsb2FkKCk7CisJCX0KKwl9ICAgIAorCit9CisKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvbmV0L3NmL3RhdmVybmEvdDIvd29ya2JlbmNoL3VpL2NyZWRlbnRpYWxtYW5hZ2VyL05ld0VkaXRQYXNzd29yZEVudHJ5RGlhbG9nLmphdmEgYi9zcmMvbWFpbi9qYXZhL25ldC9zZi90YXZlcm5hL3QyL3dvcmtiZW5jaC91aS9jcmVkZW50aWFsbWFuYWdlci9OZXdFZGl0UGFzc3dvcmRFbnRyeURpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNmUwNmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL25ldC9zZi90YXZlcm5hL3QyL3dvcmtiZW5jaC91aS9jcmVkZW50aWFsbWFuYWdlci9OZXdFZGl0UGFzc3dvcmRFbnRyeURpYWxvZy5qYXZhCkBAIC0wLDAgKzEsMzg1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBVbml2ZXJzaXR5IG9mIE1hbmNoZXN0ZXIgICAKKyAqIAorICogIE1vZGlmaWNhdGlvbnMgdG8gdGhlIGluaXRpYWwgY29kZSBiYXNlIGFyZSBjb3B5cmlnaHQgb2YgdGhlaXIKKyAqICByZXNwZWN0aXZlIGF1dGhvcnMsIG9yIHRoZWlyIGVtcGxveWVycyBhcyBhcHByb3ByaWF0ZS4KKyAqIAorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAgICAKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqICAgIAorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2UgbmV0LnNmLnRhdmVybmEudDIud29ya2JlbmNoLnVpLmNyZWRlbnRpYWxtYW5hZ2VyOworCitpbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OworaW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsKK2ltcG9ydCBqYXZhLmF3dC5GbG93TGF5b3V0OworaW1wb3J0IGphdmEuYXd0LkdyaWRMYXlvdXQ7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93QWRhcHRlcjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dFdmVudDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKK2ltcG9ydCBqYXZheC5zd2luZy5KRGlhbG9nOworaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKK2ltcG9ydCBqYXZheC5zd2luZy5KTGFiZWw7CitpbXBvcnQgamF2YXguc3dpbmcuSlBhc3N3b3JkRmllbGQ7CitpbXBvcnQgamF2YXguc3dpbmcuSlRleHRGaWVsZDsKK2ltcG9ydCBqYXZheC5zd2luZy5KT3B0aW9uUGFuZTsKK2ltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7CitpbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkNvbXBvdW5kQm9yZGVyOworaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5FbXB0eUJvcmRlcjsKK2ltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuRXRjaGVkQm9yZGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7CisKK2ltcG9ydCBuZXQuc2YudGF2ZXJuYS50Mi5zZWN1cml0eS5jcmVkZW50aWFsbWFuYWdlci5DTUV4Y2VwdGlvbjsKK2ltcG9ydCBuZXQuc2YudGF2ZXJuYS50Mi5zZWN1cml0eS5jcmVkZW50aWFsbWFuYWdlci5DcmVkZW50aWFsTWFuYWdlcjsKKworLyoqCisgKiBEaWFsb2cgdXNlZCBmb3IgZWRpdGluZyBvciBlbnRlcmluZyBuZXcgc2VydmljZSBVUkwsIHVzZXJuYW1lIG9yIHBhc3N3b3JkIG9mIGEgcGFzc3dvcmQgZW50cnkuCisgKiAKKyAqIEBhdXRob3IgQWxleCBOZW5hZGljCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQorcHVibGljIGNsYXNzIE5ld0VkaXRQYXNzd29yZEVudHJ5RGlhbG9nIGV4dGVuZHMgSkRpYWxvZworeworCS8vICdFZGl0JyBtb2RlIGNvbnN0YW50IC0gdGhlIGRpYWxvZyBpcyBpbiB0aGUgJ2VkaXQnIGVudHJ5IG1vZGUKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9NT0RFID0gIkVkaXQiOworCQorCS8vICdOZXcnIG1vZGUgY29uc3RhbnQgLSB0aGUgZGlhbG9nIGlzIGluIHRoZSAnbmV3JyBlbnRyeSBtb2RlCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19NT0RFID0gIk5FVyI7CisJCisJLy8gTW9kZSBvZiB0aGlzIGRpYWxvZyAtIE5FV19NT0RFIGZvciBlbnRlcmluZyBuZXcgcGFzc3dvcmQgZW50cnkgYW5kIEVESVRfTU9ERSBmb3IgZWRpdHRpbmcgYW4gZXhpc3RpbmcgcGFzc3dvcmQgZW50cnkgKi8KKwlTdHJpbmcgbW9kZTsKKyAgCisgICAgLy8gU2VydmljZSBVUkwgZmllbGQKKyAgICBwcml2YXRlIEpUZXh0RmllbGQganRmU2VydmljZVVSTDsKKyAgICAKKyAgICAvLyBVc2VybmFtZSBmaWVsZAorICAgIHByaXZhdGUgSlRleHRGaWVsZCBqdGZVc2VybmFtZTsKKyAgICAKKyAgICAvLyBGaXJzdCBwYXNzd29yZCBlbnRyeSBmaWVsZAorICAgIHByaXZhdGUgSlBhc3N3b3JkRmllbGQganBmRmlyc3RQYXNzd29yZDsKKworICAgIC8vIFBhc3N3b3JkIGNvbmZpcm1hdGlvbiBlbnRyeSBmaWVsZAorICAgIHByaXZhdGUgSlBhc3N3b3JkRmllbGQganBmQ29uZmlybVBhc3N3b3JkOworCisgICAgLy8gU3RvcmVzIHNlcnZpY2UgVVJMIGVudGVyZWQgCisgICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZVVSTDsgICAgCisgICAgCisgICAgLy8gU3RvcmVzIHVzZXJuYW1lIGVudGVyZWQgCisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlcm5hbWU7CisgICAgCisgICAgLy8gU3RvcmVzIHBhc3N3b3JkIGVudGVyZWQKKyAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZDsKKyAgICAKKyAgICBwcml2YXRlIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKE5ld0VkaXRQYXNzd29yZEVudHJ5RGlhbG9nLmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgbmV3IE5ld0VkaXRQYXNzd29yZEVudHJ5RGlhbG9nIGRpYWxvZyB3aGVyZSBwYXJlbnQgaXMgYSBmcmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTmV3RWRpdFBhc3N3b3JkRW50cnlEaWFsb2coSkZyYW1lIHBhcmVudCwgU3RyaW5nIHRpdGxlLAorCQkJYm9vbGVhbiBtb2RhbCwgU3RyaW5nIGN1cnJlbnRVUkwsIFN0cmluZyBjdXJyZW50VXNlcm5hbWUsCisJCQlTdHJpbmcgY3VycmVudFBhc3N3b3JkKQorICAgIHsKKyAgICAgICAgc3VwZXIocGFyZW50LCB0aXRsZSwgbW9kYWwpOyAgICAgICAgCisgICAgICAgIHNlcnZpY2VVUkwgPSBjdXJyZW50VVJMOworICAgICAgICB1c2VybmFtZSA9IGN1cnJlbnRVc2VybmFtZTsKKyAgICAgICAgcGFzc3dvcmQgPSBjdXJyZW50UGFzc3dvcmQ7CisgICAgICAgIGlmIChzZXJ2aWNlVVJMID09IG51bGwgJiYgdXNlcm5hbWUgPT0gbnVsbCAmJiBwYXNzd29yZCA9PSBudWxsKSAvLyBpZiBwYXNzZWQgdmFsdWVzIGFyZSBhbGwgbnVsbAorICAgICAgICB7CisgICAgICAgIAltb2RlID0gTkVXX01PREU7IC8vIGRpYWxvZyBpcyBmb3IgZW50ZXJpbmcgYSBuZXcgcGFzc3dvcmQgZW50cnkKKyAgICAgICAgfQorICAgICAgICBlbHNleworICAgICAgICAgICAgbW9kZSA9IEVESVRfTU9ERTsgLy8gZGlhbG9nIGlzIGZvciBlZGl0aW5nIGFuIGV4aXN0aW5nIGVudHJ5CisgICAgICAgIH0KKyAgICAgICAgaW5pdENvbXBvbmVudHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIG5ldyBOZXdFZGl0UGFzc3dvcmRFbnRyeURpYWxvZyBkaWFsb2cgd2hlcmUgcGFyZW50IGlzIGEgZGlhbG9nLgorICAgICAqLworICAgIHB1YmxpYyBOZXdFZGl0UGFzc3dvcmRFbnRyeURpYWxvZyhKRGlhbG9nIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBib29sZWFuIG1vZGFsLCBTdHJpbmcgY3VycmVudFVSTCwgU3RyaW5nIGN1cnJlbnRVc2VybmFtZSwgU3RyaW5nIGN1cnJlbnRQYXNzd29yZCkKKyAgICB7CisgICAgICAgIHN1cGVyKHBhcmVudCwgdGl0bGUsIG1vZGFsKTsKKyAgICAgICAgc2VydmljZVVSTCA9IGN1cnJlbnRVUkw7CisgICAgICAgIHVzZXJuYW1lID0gY3VycmVudFVzZXJuYW1lOworICAgICAgICBwYXNzd29yZCA9IGN1cnJlbnRQYXNzd29yZDsKKyAgICAgICAgaWYgKHNlcnZpY2VVUkwgPT0gbnVsbCAmJiB1c2VybmFtZSA9PSBudWxsICYmIHBhc3N3b3JkID09IG51bGwpIC8vIGlmIHBhc3NlZCB2YWx1ZXMgYXJlIGFsbCBudWxsCisgICAgICAgIHsKKyAgICAgICAgCW1vZGUgPSBORVdfTU9ERTsgLy8gZGlhbG9nIGlzIGZvciBlbnRlcmluZyBuZXcgcGFzc3dvcmQgZW50cnkKKyAgICAgICAgfQorICAgICAgICBlbHNleworICAgICAgICAgICAgbW9kZSA9IEVESVRfTU9ERTsgLy8gZGlhbG9nIGlzIGZvciBlZGl0aW5nIGV4aXN0aW5nIGVudHJ5CisgICAgICAgIH0KKyAgICAgICAgaW5pdENvbXBvbmVudHMoKTsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogR2V0IHRoZSB1c2VybmFtZSBzZXQgaW4gdGhlIGRpYWxvZy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHVzZXJuYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VybmFtZSgpCisgICAgeworICAgICAgICByZXR1cm4gdXNlcm5hbWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldCB0aGUgc2VydmljZSBVUkwgc2V0IGluIHRoZSBkaWFsb2cuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBzZXJ2aWNlIFVSTAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZVVSTCgpCisgICAgeworICAgICAgICByZXR1cm4gc2VydmljZVVSTDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwYXNzd29yZCBzZXQgaW4gdGhlIGRpYWxvZy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHBhc3N3b3JkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpCisgICAgeworICAgIAlyZXR1cm4gcGFzc3dvcmQ7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIEluaXRpYWxpc2UgdGhlIGRpYWxvZydzIEdVSSBjb21wb25lbnRzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbml0Q29tcG9uZW50cygpCisgICAgeworICAgICAgICBnZXRDb250ZW50UGFuZSgpLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOworCisgICAgICAgIEpMYWJlbCBqbFNlcnZpY2VVUkwgPSBuZXcgSkxhYmVsKCJTZXJ2aWNlIFVSTCIpOworICAgICAgICBqbFNlcnZpY2VVUkwuc2V0Qm9yZGVyKG5ldyBFbXB0eUJvcmRlcigwLDUsMCwwKSk7CisgICAgICAgIAorICAgICAgICBKTGFiZWwgamxVc2VybmFtZSA9IG5ldyBKTGFiZWwoIlVzZXJuYW1lIik7CisgICAgICAgIGpsVXNlcm5hbWUuc2V0Qm9yZGVyKG5ldyBFbXB0eUJvcmRlcigwLDUsMCwwKSk7CisgICAgICAgIAorICAgICAgICBKTGFiZWwgamxGaXJzdFBhc3N3b3JkID0gbmV3IEpMYWJlbCgiUGFzc3dvcmQiKTsKKyAgICAgICAgamxGaXJzdFBhc3N3b3JkLnNldEJvcmRlcihuZXcgRW1wdHlCb3JkZXIoMCw1LDAsMCkpOworICAgICAgICAKKyAgICAgICAgSkxhYmVsIGpsQ29uZmlybVBhc3N3b3JkID0gbmV3IEpMYWJlbCgiQ29uZmlybSBwYXNzd29yZCIpOworICAgICAgICBqbENvbmZpcm1QYXNzd29yZC5zZXRCb3JkZXIobmV3IEVtcHR5Qm9yZGVyKDAsNSwwLDApKTsKKyAgICAgICAgICAgICAgIAorICAgICAgICBqdGZTZXJ2aWNlVVJMID0gbmV3IEpUZXh0RmllbGQoMTUpOworICAgICAgICAvL2p0ZlNlcnZpY2VVUkwuc2V0Qm9yZGVyKG5ldyBFbXB0eUJvcmRlcigwLDAsMCw1KSk7CisKKyAgICAgICAganRmVXNlcm5hbWUgPSBuZXcgSlRleHRGaWVsZCgxNSk7CisgICAgICAgIC8vanRmVXNlcm5hbWUuc2V0Qm9yZGVyKG5ldyBFbXB0eUJvcmRlcigwLDAsMCw1KSk7CisKKyAgICAgICAganBmRmlyc3RQYXNzd29yZCA9IG5ldyBKUGFzc3dvcmRGaWVsZCgxNSk7CisgICAgICAgIC8vanBmRmlyc3RQYXNzd29yZC5zZXRCb3JkZXIobmV3IEVtcHR5Qm9yZGVyKDAsMCwwLDUpKTsKKworICAgICAgICBqcGZDb25maXJtUGFzc3dvcmQgPSBuZXcgSlBhc3N3b3JkRmllbGQoMTUpOworICAgICAgICAvL2pwZkNvbmZpcm1QYXNzd29yZC5zZXRCb3JkZXIobmV3IEVtcHR5Qm9yZGVyKDAsMCwwLDUpKTsKKworICAgICAgICAKKyAgICAgICAgLy9JZiBpbiBFRElUX01PREUgLSBwb3B1bGF0ZSB0aGUgZmllbGRzIHdpdGggY3VycmVudCB2YWx1ZXMKKyAgICAgICAgaWYgKG1vZGUuZXF1YWxzKEVESVRfTU9ERSkpeworICAgICAgICAgICAganRmU2VydmljZVVSTC5zZXRUZXh0KHNlcnZpY2VVUkwpOworICAgICAgICAgICAganRmVXNlcm5hbWUuc2V0VGV4dCh1c2VybmFtZSk7ICAgICAKKyAgICAgICAgICAgIGpwZkZpcnN0UGFzc3dvcmQuc2V0VGV4dChwYXNzd29yZCk7CisgICAgICAgICAgICBqcGZDb25maXJtUGFzc3dvcmQuc2V0VGV4dChwYXNzd29yZCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEpCdXR0b24gamJPSyA9IG5ldyBKQnV0dG9uKCJPSyIpOworICAgICAgICBqYk9LLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb2tQcmVzc2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIEpCdXR0b24gamJDYW5jZWwgPSBuZXcgSkJ1dHRvbigiQ2FuY2VsIik7CisgICAgICAgIGpiQ2FuY2VsLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FuY2VsUHJlc3NlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBKUGFuZWwganBQYXNzd29yZCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoNCwgMiwgNSwgNSkpOworICAgICAgICBqcFBhc3N3b3JkLmFkZChqbFNlcnZpY2VVUkwpOworICAgICAgICBqcFBhc3N3b3JkLmFkZChqdGZTZXJ2aWNlVVJMKTsKKyAgICAgICAganBQYXNzd29yZC5hZGQoamxVc2VybmFtZSk7CisgICAgICAgIGpwUGFzc3dvcmQuYWRkKGp0ZlVzZXJuYW1lKTsKKyAgICAgICAganBQYXNzd29yZC5hZGQoamxGaXJzdFBhc3N3b3JkKTsKKyAgICAgICAganBQYXNzd29yZC5hZGQoanBmRmlyc3RQYXNzd29yZCk7CisgICAgICAgIGpwUGFzc3dvcmQuYWRkKGpsQ29uZmlybVBhc3N3b3JkKTsKKyAgICAgICAganBQYXNzd29yZC5hZGQoanBmQ29uZmlybVBhc3N3b3JkKTsKKyAgICAgICAgCisgICAgICAgIGpwUGFzc3dvcmQuc2V0Qm9yZGVyKG5ldyBDb21wb3VuZEJvcmRlcigKKyAgICAgICAgICAgICAgICBuZXcgRW1wdHlCb3JkZXIoMTAsIDEwLCAxMCwgMTApLCBuZXcgRXRjaGVkQm9yZGVyKCkpKTsKKyAgICAgICAgCisgICAgICAgIGpwUGFzc3dvcmQuc2V0TWluaW11bVNpemUobmV3IERpbWVuc2lvbigzMDAsMTAwKSk7CisKKyAgICAgICAgSlBhbmVsIGpwQnV0dG9ucyA9IG5ldyBKUGFuZWwobmV3IEZsb3dMYXlvdXQoRmxvd0xheW91dC5DRU5URVIpKTsKKyAgICAgICAganBCdXR0b25zLmFkZChqYk9LKTsKKyAgICAgICAganBCdXR0b25zLmFkZChqYkNhbmNlbCk7CisKKyAgICAgICAgZ2V0Q29udGVudFBhbmUoKS5hZGQoanBQYXNzd29yZCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisgICAgICAgIGdldENvbnRlbnRQYW5lKCkuYWRkKGpwQnV0dG9ucywgQm9yZGVyTGF5b3V0LlNPVVRIKTsKKworICAgICAgICBhZGRXaW5kb3dMaXN0ZW5lcihuZXcgV2luZG93QWRhcHRlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZXZ0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsb3NlRGlhbG9nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIHNldFJlc2l6YWJsZShmYWxzZSk7CisKKyAgICAgICAgZ2V0Um9vdFBhbmUoKS5zZXREZWZhdWx0QnV0dG9uKGpiT0spOworCisgICAgICAgIHBhY2soKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgZm9yIHRoZSBmb2xsb3dpbmc6CisgICAgICogPHVsPgorICAgICAqICAgICA8bGk+VGhhdCB0aGUgdXNlciBoYXMgc3VwcGxpZWQgYSBub24gZW1wdHkgc2VydmljZSBVUkwKKyAgICAgKiAgICAgPGxpPlRoYXQgdGhlIHVzZXIgaGFzIHN1cHBsaWVkIGEgbm9uIGVtcHR5IHVzZXJuYW1lCisgICAgICogICAgIDxsaT5UaGF0IHRoZSB1c2VyIGhhcyBzdXBwbGllZCBhbmQgY29uZmlybWVkIGEgbm9uIGVtcHR5IHBhc3N3b3JkCisgICAgICogICAgIDxsaT5UaGF0IHRoZSBlbnRyeSB3aXRoIHRoZSBzYW1lIFVSTCBhbHJlYWR5IGRvZXMgbm90IGV4aXN0IGluIHRoZSBLZXlzdG9yZQorICAgICAqIDwvdWw+CisgICAgICogYW5kIHN0b3JlcyB0aGUgbmV3IHBhc3N3b3JkIGluIHRoaXMgb2JqZWN0LgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIC0gaWYgdGhlIHVzZXIncyBkaWFsb2cgZW50cnkgbWF0Y2hlcyB0aGUgYWJvdmUgY3JpdGVyaWEsIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0NvbnRyb2xzKCkKKyAgICB7CisgICAgCXNlcnZpY2VVUkwgPSBuZXcgU3RyaW5nKGp0ZlNlcnZpY2VVUkwuZ2V0VGV4dCgpKTsKKyAgICAJaWYgKHNlcnZpY2VVUkwubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcywKKyAgICAgICAgICAgICAgICAiU2VydmljZSBVUkwgY2Fubm90IGJlIGVtcHR5IiwgCisgICAgICAgICAgICAgICAgIkNyZWRlbnRpYWwgTWFuYWdlciBXYXJuaW5nIiwKKyAgICAgICAgICAgICAgICBKT3B0aW9uUGFuZS5XQVJOSU5HX01FU1NBR0UpOworICAgICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCX0KKyAgICAJCisgICAgCXVzZXJuYW1lID0gbmV3IFN0cmluZyhqdGZVc2VybmFtZS5nZXRUZXh0KCkpOworICAgIAlpZiAodXNlcm5hbWUubGVuZ3RoKCkgPT0gMCl7CisgICAgICAgICAgICBKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyh0aGlzLAorICAgICAgICAgICAgICAgICJVc2VybmFtZSBjYW5ub3QgYmUgZW1wdHkiLCAKKyAgICAgICAgICAgICAgICAiQ3JlZGVudGlhbCBNYW5hZ2VyIFdhcm5pbmciLAorICAgICAgICAgICAgICAgIEpPcHRpb25QYW5lLldBUk5JTkdfTUVTU0FHRSk7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAJfQorICAgIAkgICAJCisgICAgCVN0cmluZyBzRmlyc3RQYXNzd29yZCA9IG5ldyBTdHJpbmcoanBmRmlyc3RQYXNzd29yZC5nZXRQYXNzd29yZCgpKTsKKyAgICAgICAgU3RyaW5nIHNDb25maXJtUGFzc3dvcmQgPSBuZXcgU3RyaW5nKGpwZkNvbmZpcm1QYXNzd29yZC5nZXRQYXNzd29yZCgpKTsKKworICAgIAlpZiAoKHNGaXJzdFBhc3N3b3JkLmxlbmd0aCgpID4gMCkgJiYgKHNGaXJzdFBhc3N3b3JkLmVxdWFscyhzQ29uZmlybVBhc3N3b3JkKSkpIHsgLy8gcGFzc3dvcmRzIHRoZSBzYW1lIGFuZCBub24tZW1wdHkKKyAgICAJCXBhc3N3b3JkID0gc0ZpcnN0UGFzc3dvcmQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKHNGaXJzdFBhc3N3b3JkLmxlbmd0aCgpID09IDApICYmIChzRmlyc3RQYXNzd29yZC5lcXVhbHMoc0NvbmZpcm1QYXNzd29yZCkpKXsgLy8gcGFzc3dvcmRzIG1hdGNoIGJ1dCBhcmUgZW1wdHkKKworICAgICAgICAgICAgSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcywKKyAgICAgICAgICAgICAgICAiUGFzc3dvcmQgY2Fubm90IGJlIGVtcHR5IiwgCisgICAgICAgICAgICAgICAgIkNyZWRlbnRpYWwgTWFuYWdlciBXYXJuaW5nIiwKKyAgICAgICAgICAgICAgICBKT3B0aW9uUGFuZS5XQVJOSU5HX01FU1NBR0UpOworCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAJCisgICAgICAgIH0KKyAgICAgICAgZWxzZXsgLy8gcGFzc3dvcmRzIGRvIG5vdCBtYXRjaAorICAgICAgICAgICAgSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcywKKyAgICAgICAgICAgICAgICAiUGFzc3dvcmRzIGRvIG5vdCBtYXRjaCIsIAorICAgICAgICAgICAgICAgICJDcmVkZW50aWFsIE1hbmFnZXIgV2FybmluZyIsCisgICAgICAgICAgICAgICAgSk9wdGlvblBhbmUuV0FSTklOR19NRVNTQUdFKTsKKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgIAkKKyAgICAgICAgfQorICAgIAkKKwkJLy8gQ2hlY2sgaWYgdGhlIGVudGVyZWQgVVJMIGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIGFub3RoZXIga2V5IHBhaXIgZW50cnkgaW4gdGhlIEtleXN0b3JlCisgICAgCUNyZWRlbnRpYWxNYW5hZ2VyIGNyZWRNYW5hZ2VyID0gbnVsbDsKKyAgICAJdHJ5IHsKKwkJCWNyZWRNYW5hZ2VyID0gQ3JlZGVudGlhbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKKwkJfSBjYXRjaCAoQ01FeGNlcHRpb24gY21lKSB7CisJCQkvLyBGYWlsZWQgdG8gaW5zdGFudGlhdGUgQ3JlZGVudGlhbCBNYW5hZ2VyIC0gd2FybiB0aGUgdXNlciBhbmQgZXhpdAorCQkJU3RyaW5nIGV4TWVzc2FnZSA9ICJGYWlsZWQgdG8gaW5zdGFudGlhdGUgQ3JlZGVudGlhbCBNYW5hZ2VyIjsKKwkJCWxvZ2dlci5lcnJvcihleE1lc3NhZ2UsIGNtZSk7CisJCQljbWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhuZXcgSkZyYW1lKCksIGV4TWVzc2FnZSwKKwkJCQkJIkNyZWRlbnRpYWwgTWFuYWdlciBFcnJvciIsIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisgICAJCisgICAgCUhhc2hNYXA8U3RyaW5nLCBBcnJheUxpc3Q8U3RyaW5nPj4gdXJsTWFwID0gY3JlZE1hbmFnZXIuZ2V0U2VydmljZVVSTHNmb3JLZXlQYWlycygpOworICAgICAgIAlpZiAodXJsTWFwICE9IG51bGwpeyAvLyBzaG91bGQgbm90IGJlIG51bGwgcmVhbGx5IChhbHRob3VnaCBjYW4gYmUgZW1wdHkpLiBDaGVjayBhbnl3YXkuCisgICAgICAgIAlTZXQ8U3RyaW5nPiBhbGlhc2VzID0gdXJsTWFwLmtleVNldCgpOworICAgICAgICAJZm9yIChJdGVyYXRvcjxTdHJpbmc+IGkgPSBhbGlhc2VzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApeworICAgICAgICAJCVN0cmluZyBhbGlhcyA9IChTdHJpbmcpIGkubmV4dCgpOworICAgICAgICAJCS8vIENoZWNrIGlmIHVybCBsaXN0IGZvciB0aGlzIGFsaWFzIGNvbnRhaW5zIHRoZSBuZXdseSBlbnRlcmVkIHVybAorICAgICAgICAJCUFycmF5TGlzdDxTdHJpbmc+IHVybHMgPSAoQXJyYXlMaXN0PFN0cmluZz4pIHVybE1hcC5nZXQoYWxpYXMpOworICAgICAgICAJCWlmICh1cmxzLmNvbnRhaW5zKHNlcnZpY2VVUkwpKXsKKyAgICAgICAgICAgIAkJLy8gV2FybiB0aGUgdXNlciBhbmQgZXhpdAorICAgICAgICAgICAgICAgIAlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZygKKyAgICAgICAgICAgICAgICAgICAgCQl0aGlzLCAKKyAgICAgICAgICAgICAgICAgICAgCQkiVGhlIGVudGVyZWQgVVJMIGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIGFub3RoZXIga2V5IHBhaXIgZW50cnkiLAorICAgICAgICAgICAgICAgIAkJCSJDcmVkZW50aWFsIE1hbmFnZXIgQWxlcnQiLAorICAgICAgICAgICAgICAgIAkJCUpPcHRpb25QYW5lLklORk9STUFUSU9OX01FU1NBR0UpOworICAgICAgICAgICAgICAgIAlyZXR1cm4gZmFsc2U7CisgICAgICAgIAkJfSAgICAJCQorICAgICAgICAJIH0KKyAgICAgICAJfQorICAgIAkKKyAgICAJcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogT0sgYnV0dG9uIHByZXNzZWQgb3Igb3RoZXJ3aXNlIGFjdGl2YXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgb2tQcmVzc2VkKCkKKyAgICB7CisgICAgICAgIGlmIChjaGVja0NvbnRyb2xzKCkpIHsKKyAgICAgICAgICAgIGNsb3NlRGlhbG9nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWwgYnV0dG9uIHByZXNzZWQgb3Igb3RoZXJ3aXNlIGFjdGl2YXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2FuY2VsUHJlc3NlZCgpCisgICAgeworICAgIAkvLyBTZXQgYWxsIGZpZWxkcyB0byBudWxsIHRvIGluZGljYXRlIHRoYXQgY2FuY2VsIGJ1dHRvbiB3YXMgcHJlc3NlZAorICAgIAlzZXJ2aWNlVVJMID0gbnVsbDsKKyAgICAJdXNlcm5hbWUgPSBudWxsOworICAgIAlwYXNzd29yZCA9IG51bGw7CisgICAgICAgIGNsb3NlRGlhbG9nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIGRpYWxvZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2xvc2VEaWFsb2coKQorICAgIHsKKyAgICAgICAgc2V0VmlzaWJsZShmYWxzZSk7CisgICAgICAgIGRpc3Bvc2UoKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvbmV0L3NmL3RhdmVybmEvdDIvd29ya2JlbmNoL3VpL2NyZWRlbnRpYWxtYW5hZ2VyL05ld0tleVBhaXJFbnRyeURpYWxvZy5qYXZhIGIvc3JjL21haW4vamF2YS9uZXQvc2YvdGF2ZXJuYS90Mi93b3JrYmVuY2gvdWkvY3JlZGVudGlhbG1hbmFnZXIvTmV3S2V5UGFpckVudHJ5RGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFjNWUxNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvbmV0L3NmL3RhdmVybmEvdDIvd29ya2JlbmNoL3VpL2NyZWRlbnRpYWxtYW5hZ2VyL05ld0tleVBhaXJFbnRyeURpYWxvZy5qYXZhCkBAIC0wLDAgKzEsNTY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBVbml2ZXJzaXR5IG9mIE1hbmNoZXN0ZXIgICAKKyAqIAorICogIE1vZGlmaWNhdGlvbnMgdG8gdGhlIGluaXRpYWwgY29kZSBiYXNlIGFyZSBjb3B5cmlnaHQgb2YgdGhlaXIKKyAqICByZXNwZWN0aXZlIGF1dGhvcnMsIG9yIHRoZWlyIGVtcGxveWVycyBhcyBhcHByb3ByaWF0ZS4KKyAqIAorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAgICAKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqICAgIAorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2UgbmV0LnNmLnRhdmVybmEudDIud29ya2JlbmNoLnVpLmNyZWRlbnRpYWxtYW5hZ2VyOworCitpbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OworaW1wb3J0IGphdmEuYXd0LkZsb3dMYXlvdXQ7CitpbXBvcnQgamF2YS5hd3QuRm9udDsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dBZGFwdGVyOworaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50OworaW1wb3J0IGphdmEuc2VjdXJpdHkuR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5U3RvcmU7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOworaW1wb3J0IGphdmF4LnN3aW5nLkpEaWFsb2c7CitpbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOworaW1wb3J0IGphdmF4LnN3aW5nLkpMYWJlbDsKK2ltcG9ydCBqYXZheC5zd2luZy5KTGlzdDsKK2ltcG9ydCBqYXZheC5zd2luZy5EZWZhdWx0TGlzdE1vZGVsOworaW1wb3J0IGphdmF4LnN3aW5nLkpPcHRpb25QYW5lOworaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKK2ltcG9ydCBqYXZheC5zd2luZy5KU2Nyb2xsUGFuZTsKK2ltcG9ydCBqYXZheC5zd2luZy5Cb3hMYXlvdXQ7CitpbXBvcnQgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsOworaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5Db21wb3VuZEJvcmRlcjsKK2ltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuRW1wdHlCb3JkZXI7CitpbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkV0Y2hlZEJvcmRlcjsKK2ltcG9ydCBqYXZheC5zd2luZy5ldmVudC5MaXN0U2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdFNlbGVjdGlvbkxpc3RlbmVyOworCitpbXBvcnQgbmV0LnNmLnRhdmVybmEudDIuc2VjdXJpdHkuY3JlZGVudGlhbG1hbmFnZXIuQ01FeGNlcHRpb247CitpbXBvcnQgbmV0LnNmLnRhdmVybmEudDIuc2VjdXJpdHkuY3JlZGVudGlhbG1hbmFnZXIuQ01YNTA5VXRpbDsKK2ltcG9ydCBuZXQuc2YudGF2ZXJuYS50Mi5zZWN1cml0eS5jcmVkZW50aWFsbWFuYWdlci5DcmVkZW50aWFsTWFuYWdlcjsKK2ltcG9ydCBuZXQuc2YudGF2ZXJuYS50Mi53b3JrYmVuY2gudWkuY3JlZGVudGlhbG1hbmFnZXIuR2V0U2VydmljZVVSTERpYWxvZzsKK2ltcG9ydCBuZXQuc2YudGF2ZXJuYS50Mi53b3JrYmVuY2gudWkuY3JlZGVudGlhbG1hbmFnZXIuVmlld0NlcnREZXRhaWxzRGlhbG9nOworCisvKioKKyAqIERpYWxvZyB0aGF0IGRpc3BsYXlzIHRoZSBkZXRhaWxzIG9mIGFsbCBrZXkgcGFpcnMgZnJvbSBhIFBLQ1MgIzEyCisgKiBrZXlzdG9yZSBhbGxvd2luZyB0aGUgdXNlciB0byBwaWNrIG9uZSBmb3IgaW1wb3J0LgorICogCisgKiBAYXV0aG9yIEFsZXggTmVuYWRpYworICovCitAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKK2NsYXNzIE5ld0tleVBhaXJFbnRyeURpYWxvZyBleHRlbmRzIEpEaWFsb2cKK3sKKwkvLyBMaXN0IG9mIGtleSBwYWlycyBhdmFpbGFibGUgZm9yIGltcG9ydCAKKyAgICBwcml2YXRlIEpMaXN0IGpsdEtleVBhaXJzOworCisgICAgLy8gU2VydmljZSBVUkwgdGV4dCBmaWVsZCBmb3IgdXNlciB0byBlbnRlcgorICAgIHByaXZhdGUgSkxpc3Qgamx0U2VydmljZVVSTHM7CisgICAgCisgICAgLy8gU2VydmljZSBVUkwgKGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IHBhaXIpCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPiBzZXJ2aWNlVVJMczsKKworICAgIC8vIFBLQ1MgIzEyIGtleXN0b3JlICovCisgICAgcHJpdmF0ZSBLZXlTdG9yZSBwa2NzMTJLZXlTdG9yZTsKKworICAgIC8vIFByaXZhdGUga2V5IHBhcnQgb2Yga2V5IHBhaXIgY2hvc2VuIGJ5IHRoZSB1c2VyIGZvciBpbXBvcnQgCisgICAgcHJpdmF0ZSBLZXkgcHJpdmF0ZUtleTsKKworICAgIC8vIENlcnRpZmljYXRlIGNoYWluIHBhcnQgb2Yga2V5IHBhaXIgY2hvc2VuIGJ5IHRoZSB1c2VyIGZvciBpbXBvcnQgCisgICAgcHJpdmF0ZSBDZXJ0aWZpY2F0ZVtdIGNlcnRpZmljYXRlQ2hhaW47CisKKyAgICAvLyBLZXkgcGFpciBhbGlhcyB0byBiZSB1c2VkIGZvciB0aGlzIGVudHJ5IGluIHRoZSBLZXlzdG9yZSAKKyAgICBwcml2YXRlIFN0cmluZyBhbGlhczsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIG5ldyBmb3JtIE5ld0tleVBhaXJFbnRyeURpYWxvZyB3aGVyZSB0aGUgcGFyZW50IGlzIGEgZnJhbWUuCisgICAgICovCisgICAgcHVibGljIE5ld0tleVBhaXJFbnRyeURpYWxvZyhKRnJhbWUgcGFyZW50LCBTdHJpbmcgdGl0bGUsIGJvb2xlYW4gbW9kYWwsIEtleVN0b3JlIHBrY3MxMktTKQorICAgICAgICB0aHJvd3MgQ01FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHN1cGVyKHBhcmVudCwgdGl0bGUsIG1vZGFsKTsKKyAgICAgICAgcGtjczEyS2V5U3RvcmUgPSBwa2NzMTJLUzsKKyAgICAgICAgaW5pdENvbXBvbmVudHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIG5ldyBmb3JtIE5ld0tleVBhaXJFbnRyeURpYWxvZyB3aGVyZSB0aGUgcGFyZW50IGlzIGEgZGlhbG9nLgorICAgICAqLworICAgIHB1YmxpYyBOZXdLZXlQYWlyRW50cnlEaWFsb2coSkRpYWxvZyBwYXJlbnQsIFN0cmluZyB0aXRsZSwgYm9vbGVhbiBtb2RhbCwgS2V5U3RvcmUgcGtjczEyS1MpCisgICAgICAgIHRocm93cyBDTUV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgc3VwZXIocGFyZW50LCB0aXRsZSwgbW9kYWwpOworICAgICAgICBwa2NzMTJLZXlTdG9yZSA9IHBrY3MxMktTOworICAgICAgICBpbml0Q29tcG9uZW50cygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcHJpdmF0ZSBwYXJ0IG9mIHRoZSBrZXkgcGFpciBjaG9zZW4gYnkgdGhlIHVzZXIgZm9yIGltcG9ydC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHByaXZhdGUga2V5IG9yIG51bGwgaWYgdGhlIHVzZXIgaGFzIG5vdCBjaG9zZW4gYSBrZXkgcGFpcgorICAgICAqLworICAgIHB1YmxpYyBLZXkgZ2V0UHJpdmF0ZUtleSgpCisgICAgeworICAgICAgICByZXR1cm4gcHJpdmF0ZUtleTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNlcnRpZmljYXRlIGNoYWluIHBhcnQgb2YgdGhlIGtleSBwYWlyIGNob3NlbiBieSB0aGUKKyAgICAgKiB1c2VyIGZvciBpbXBvcnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjZXJ0aWZpY2F0ZSBjaGFpbiBvciBudWxsIGlmIHRoZSB1c2VyIGhhcyBub3QKKyAgICAgKiBjaG9zZW4gYSBrZXkgcGFpcgorICAgICAqLworICAgIHB1YmxpYyBDZXJ0aWZpY2F0ZVtdIGdldENlcnRpZmljYXRlQ2hhaW4oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNlcnRpZmljYXRlQ2hhaW47CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBhbGlhcyBvZiB0aGUga2V5IHBhaXIgY2hvc2VuIGJ5IHRoZSB1c2VyIGZvciBpbXBvcnQuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgYWxpYXMKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEFsaWFzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBhbGlhczsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzZXJ2aWNlIFVSTHMgZW50ZXJlZCBieSB0aGUgdXNlci4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGxpc3Qgb2Ygc2VydmljZSBVUkxzCisgICAgICovCisgICAgcHVibGljIEFycmF5TGlzdDxTdHJpbmc+IGdldFNlcnZpY2VVUkxzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBzZXJ2aWNlVVJMczsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogSW5pdGlhbGlzZSB0aGUgZGlhbG9nJ3MgR1VJIGNvbXBvbmVudHMuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIENNRXhjZXB0aW9uIEEgcHJvYmxlbSB3YXMgZW5jb3VudGVyZWQgaW1wb3J0aW5nIGEga2V5IHBhaXIKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaW5pdENvbXBvbmVudHMoKQorICAgICAgICB0aHJvd3MgQ01FeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vIEluc3RydWN0aW9ucworICAgICAgICBKTGFiZWwgamxJbnN0cnVjdGlvbnMgPSBuZXcgSkxhYmVsKCJTZWxlY3QgYSBrZXkgcGFpciBmb3IgaW1wb3J0OiIpOworICAgICAgICBqbEluc3RydWN0aW9ucy5zZXRGb250KG5ldyBGb250KG51bGwsIEZvbnQuUExBSU4sIDExKSk7CisgICAgICAgIGpsSW5zdHJ1Y3Rpb25zLnNldEJvcmRlcihuZXcgRW1wdHlCb3JkZXIoNSw1LDUsNSkpOworICAgICAgICBKUGFuZWwganBJbnN0cnVjdGlvbnMgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7CisgICAgICAgIGpwSW5zdHJ1Y3Rpb25zLmFkZChqbEluc3RydWN0aW9ucywgQm9yZGVyTGF5b3V0LldFU1QpOworCisgICAgICAgIC8vIEltcG9ydCBidXR0b24KKyAgICAgICAgZmluYWwgSkJ1dHRvbiBqYkltcG9ydCA9IG5ldyBKQnV0dG9uKCJJbXBvcnQiKTsKKyAgICAgICAgamJJbXBvcnQuc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgIGpiSW1wb3J0LmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW1wb3J0UHJlc3NlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICAvLyBDZXJ0aWZpY2F0ZSBkZXRhaWxzIGJ1dHRvbgorICAgICAgICBmaW5hbCBKQnV0dG9uIGpiQ2VydGlmaWNhdGVEZXRhaWxzID0gbmV3IEpCdXR0b24oIkNlcnRpZmljYXRlIERldGFpbHMiKTsKKyAgICAgICAgamJDZXJ0aWZpY2F0ZURldGFpbHMuc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgIGpiQ2VydGlmaWNhdGVEZXRhaWxzLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2VydGlmaWNhdGVEZXRhaWxzUHJlc3NlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICAvLyBMaXN0IHRvIGhvbGQga2V5c3RvcmUncyBrZXkgcGFpcnMKKyAgICAgICAgamx0S2V5UGFpcnMgPSBuZXcgSkxpc3QoKTsKKyAgICAgICAgamx0S2V5UGFpcnMuc2V0U2VsZWN0aW9uTW9kZShMaXN0U2VsZWN0aW9uTW9kZWwuU0lOR0xFX1NFTEVDVElPTik7CisgICAgICAgIGpsdEtleVBhaXJzLmFkZExpc3RTZWxlY3Rpb25MaXN0ZW5lcihuZXcgTGlzdFNlbGVjdGlvbkxpc3RlbmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKExpc3RTZWxlY3Rpb25FdmVudCBldnQpCisgICAgICAgICAgICB7CQorICAgICAgICAgICAgICAgIGlmIChqbHRLZXlQYWlycy5nZXRTZWxlY3RlZEluZGV4KCkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgamJJbXBvcnQuc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGpiQ2VydGlmaWNhdGVEZXRhaWxzLnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgamJJbXBvcnQuc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgamJDZXJ0aWZpY2F0ZURldGFpbHMuc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIC8vIFB1dCB0aGUga2V5IGxpc3QgaW50byBhIHNjcm9sbCBwYW5lCisgICAgICAgIEpTY3JvbGxQYW5lIGpzcEtleVBhaXJzID0gbmV3IEpTY3JvbGxQYW5lKGpsdEtleVBhaXJzLAorICAgICAgICAgICAgSlNjcm9sbFBhbmUuVkVSVElDQUxfU0NST0xMQkFSX0FTX05FRURFRCwKKyAgICAgICAgICAgIEpTY3JvbGxQYW5lLkhPUklaT05UQUxfU0NST0xMQkFSX0FTX05FRURFRCk7CisgICAgICAgIGpzcEtleVBhaXJzLmdldFZpZXdwb3J0KCkuc2V0QmFja2dyb3VuZChqbHRLZXlQYWlycy5nZXRCYWNrZ3JvdW5kKCkpOworICAgICAgICAKKyAgICAgICAgLy8gU2VydmljZSBVUkxzIGxpc3QKKyAgICAgICAgLy8gTGFiZWwKKyAgICAgICAgSkxhYmVsIGpsU2VydmljZVVSTCA9IG5ldyBKTGFiZWwgKCJTZXJ2aWNlIFVSTHMgdGhlIGtleSBwYWlyIHdpbGwgYmUgdXNlZCBmb3I6Iik7CisgICAgICAgIGpsU2VydmljZVVSTC5zZXRGb250KG5ldyBGb250KG51bGwsIEZvbnQuUExBSU4sIDExKSk7CisgICAgICAgIGpsU2VydmljZVVSTC5zZXRCb3JkZXIobmV3IEVtcHR5Qm9yZGVyKDUsNSw1LDUpKTsgICAgICAgICAgIAorICAgICAgICAvLyBOZXcgZW1wdHkgc2VydmljZSBVUkxzIGxpc3QKKyAgICAgICAgRGVmYXVsdExpc3RNb2RlbCBqbHRNb2RlbCA9IG5ldyBEZWZhdWx0TGlzdE1vZGVsKCk7CisgICAgICAgIGpsdFNlcnZpY2VVUkxzID0gbmV3IEpMaXN0KGpsdE1vZGVsKTsgCisgICAgICAgIC8vICdBZGQnIHNlcnZpY2UgVVJMIGJ1dHRvbgorICAgICAgICBKQnV0dG9uIGFkZEJ1dHRvbiA9IG5ldyBKQnV0dG9uKCJBZGQiKTsKKyAgICAgICAgYWRkQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpeworICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlhZGRTZXJ2aWNlVVJMUHJlc3NlZCgpOworICAgICAgICAgICAgfSAgICAgICAJCisgICAgICAgIH0pOworICAgICAgICBhZGRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgLy8gJ1JlbW92ZScgc2VydmljZSBVUkwgYnV0dG9uCisgICAgICAgIGZpbmFsIEpCdXR0b24gcmVtb3ZlQnV0dG9uID0gbmV3IEpCdXR0b24oIlJlbW92ZSIpOworICAgICAgICByZW1vdmVCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCl7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZ0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgCS8vIGdldCBzZWxlY3RlZCBpbmRpY2VzCisgICAgICAgICAgICAJaW50W10gc2VsZWN0ZWQgPSBqbHRTZXJ2aWNlVVJMcy5nZXRTZWxlY3RlZEluZGljZXMoKTsKKyAgICAgICAgICAgIAlmb3IgKGludCBpID0gc2VsZWN0ZWQubGVuZ3RoIC0xOyBpPj0wIDsgaS0tKXsKKyAgICAgICAgICAgIAkJICgoRGVmYXVsdExpc3RNb2RlbCkgamx0U2VydmljZVVSTHMuZ2V0TW9kZWwoKSkucmVtb3ZlKHNlbGVjdGVkW2ldKTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICB9ICAgICAgIAkKKyAgICAgICAgfSk7CisgICAgICAgIHJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgamx0U2VydmljZVVSTHMuYWRkTGlzdFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBMaXN0U2VsZWN0aW9uTGlzdGVuZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWQoTGlzdFNlbGVjdGlvbkV2ZW50IGV2dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoamx0U2VydmljZVVSTHMuZ2V0U2VsZWN0ZWRJbmRleCgpID09IC0xKSB7CisgICAgICAgICAgICAgICAgCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIC8vIFNjcm9sbCBwYW5lIGZvciBzZXJ2aWNlIFVSTHMgbGlzdAorICAgICAgICBKU2Nyb2xsUGFuZSBqc3BTZXJ2aWNlVVJMcyA9IG5ldyBKU2Nyb2xsUGFuZShqbHRTZXJ2aWNlVVJMcywKKyAgICAgICAgICAgICAgICBKU2Nyb2xsUGFuZS5WRVJUSUNBTF9TQ1JPTExCQVJfQVNfTkVFREVELAorICAgICAgICAgICAgICAgIEpTY3JvbGxQYW5lLkhPUklaT05UQUxfU0NST0xMQkFSX0FTX05FRURFRCk7CisgICAgICAgIGpzcFNlcnZpY2VVUkxzLmdldFZpZXdwb3J0KCkuc2V0QmFja2dyb3VuZChqbHRTZXJ2aWNlVVJMcy5nZXRCYWNrZ3JvdW5kKCkpOworICAgICAgICAKKyAgICAgICAgLy8gUGFuZWwgZm9yIEFkZCBhbmQgUmVtb3ZlIGJ1dHRvbnMKKyAgICAgICAgSlBhbmVsIGpwU2VydmljZVVSTHNCdXR0b25zID0gbmV3IEpQYW5lbChuZXcgRmxvd0xheW91dChGbG93TGF5b3V0LkNFTlRFUikpOworICAgICAgICBqcFNlcnZpY2VVUkxzQnV0dG9ucy5hZGQoYWRkQnV0dG9uKTsKKyAgICAgICAganBTZXJ2aWNlVVJMc0J1dHRvbnMuYWRkKHJlbW92ZUJ1dHRvbik7CisgICAgICAgIAorICAgICAgICAvLyBQYW5lbCB0byBob2xkIHRoZSBsaXN0IHNjcm9sbCBwYW5lIGFuZCBBZGQvUmVtb3ZlIGJ1dHRvbnMgcGFuZWwKKyAgICAgICAgSlBhbmVsIGpwU2VydmljZVVSTHMgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7CisgICAgICAgIGpwU2VydmljZVVSTHMuYWRkKGpsU2VydmljZVVSTCwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKKyAgICAgICAganBTZXJ2aWNlVVJMcy5hZGQoanNwU2VydmljZVVSTHMsIEJvcmRlckxheW91dC5DRU5URVIpOworICAgICAgICBqcFNlcnZpY2VVUkxzLmFkZChqcFNlcnZpY2VVUkxzQnV0dG9ucywgQm9yZGVyTGF5b3V0LlNPVVRIKTsKKyAgICAgICAgCisgICAgICAgIC8vIFB1dCBhbGwgdGhlIGtleSBwYWlyIGNvbXBvbmVudHMgdG9nZXRoZXIKKyAgICAgICAgSlBhbmVsIGpwS2V5UGFpcnMgPSBuZXcgSlBhbmVsKCk7IC8vIEJveExheW91dAorICAgICAgICBqcEtleVBhaXJzLnNldExheW91dChuZXcgQm94TGF5b3V0KGpwS2V5UGFpcnMsIEJveExheW91dC5ZX0FYSVMpKTsKKyAgICAgICAgLy9qcEtleVBhaXJzLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbig0MDAsIDIwMCkpOworICAgICAgICBqcEtleVBhaXJzLnNldEJvcmRlcihuZXcgQ29tcG91bmRCb3JkZXIobmV3IENvbXBvdW5kQm9yZGVyKAorICAgICAgICAgICAgbmV3IEVtcHR5Qm9yZGVyKDUsIDUsIDUsIDUpLCBuZXcgRXRjaGVkQm9yZGVyKCkpLCBuZXcgRW1wdHlCb3JkZXIoCisgICAgICAgICAgICA1LCA1LCA1LCA1KSkpOworICAgCisgICAgICAgIGpwSW5zdHJ1Y3Rpb25zLnNldEFsaWdubWVudFkoSlBhbmVsLkxFRlRfQUxJR05NRU5UKTsKKyAgICAgICAganBLZXlQYWlycy5hZGQoanBJbnN0cnVjdGlvbnMpOworICAgICAgICBqc3BLZXlQYWlycy5zZXRBbGlnbm1lbnRZKEpQYW5lbC5MRUZUX0FMSUdOTUVOVCk7CisgICAgICAgIGpwS2V5UGFpcnMuYWRkKGpzcEtleVBhaXJzKTsKKyAgICAgICAgamJDZXJ0aWZpY2F0ZURldGFpbHMuc2V0QWxpZ25tZW50WShKUGFuZWwuUklHSFRfQUxJR05NRU5UKTsKKyAgICAgICAganBLZXlQYWlycy5hZGQoamJDZXJ0aWZpY2F0ZURldGFpbHMpOworICAgICAgICBqcFNlcnZpY2VVUkxzLnNldEFsaWdubWVudFkoSlBhbmVsLkxFRlRfQUxJR05NRU5UKTsKKyAgICAgICAganBLZXlQYWlycy5hZGQoanBTZXJ2aWNlVVJMcyk7CisKKyAgICAgICAgLy8gQ2FuY2VsIGJ1dHRvbgorICAgICAgICBmaW5hbCBKQnV0dG9uIGpiQ2FuY2VsID0gbmV3IEpCdXR0b24oIkNhbmNlbCIpOworICAgICAgICBqYkNhbmNlbC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZ0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhbmNlbFByZXNzZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgSlBhbmVsIGpwQnV0dG9ucyA9IG5ldyBKUGFuZWwobmV3IEZsb3dMYXlvdXQoRmxvd0xheW91dC5DRU5URVIpKTsKKyAgICAgICAganBCdXR0b25zLmFkZChqYkltcG9ydCk7CisgICAgICAgIGpwQnV0dG9ucy5hZGQoamJDYW5jZWwpOworCisgICAgICAgIGdldENvbnRlbnRQYW5lKCkuc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7CisgICAgICAgIGdldENvbnRlbnRQYW5lKCkuYWRkKGpwS2V5UGFpcnMsIEJvcmRlckxheW91dC5DRU5URVIpOworICAgICAgICBnZXRDb250ZW50UGFuZSgpLmFkZChqcEJ1dHRvbnMsIEJvcmRlckxheW91dC5TT1VUSCk7CisKKyAgICAgICAgLy8gUG9wdWxhdGUgdGhlIGxpc3QKKyAgICAgICAgcG9wdWxhdGVMaXN0KCk7CisKKyAgICAgICAgYWRkV2luZG93TGlzdGVuZXIobmV3IFdpbmRvd0FkYXB0ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aW5kb3dDbG9zaW5nKFdpbmRvd0V2ZW50IGV2dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbG9zZURpYWxvZygpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBzZXRSZXNpemFibGUoZmFsc2UpOworCisgICAgICAgIGdldFJvb3RQYW5lKCkuc2V0RGVmYXVsdEJ1dHRvbihqYkltcG9ydCk7CisKKyAgICAgICAgcGFjaygpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUG9wdWxhdGUgdGhlIGtleSBwYWlyIGxpc3Qgd2l0aCB0aGUgUEtDUyAjMTIga2V5c3RvcmUncyBrZXkKKyAgICAgKiBwYWlyIGFsaWFzZXMuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIENNRXhjZXB0aW9uIFByb2JsZW0gYWNjZXNzaW5nIHRoZSBrZXlzdG9yZSdzIGVudHJpZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcG9wdWxhdGVMaXN0KCkKKyAgICAgICAgdGhyb3dzIENNRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkgeworICAgICAgICAJQXJyYXlMaXN0PFN0cmluZz4gdktleVBhaXJBbGlhc2VzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisKKyAgICAgICAgICAgIC8vIEZvciBlYWNoIGVudHJ5IGluIHRoZSBrZXlzdG9yZS4uLgorICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbjxTdHJpbmc+IGFsaWFzZXMgPSBwa2NzMTJLZXlTdG9yZS5hbGlhc2VzKCk7IGFsaWFzZXMuaGFzTW9yZUVsZW1lbnRzKCk7KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEdldCBhbGlhcworICAgICAgICAgICAgICAgIFN0cmluZyBzQWxpYXMgPSAoU3RyaW5nKSBhbGlhc2VzLm5leHRFbGVtZW50KCk7CisKKyAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGFsaWFzIHRvIHRoZSBsaXN0IGlmIHRoZSBlbnRyeSBoYXMgYSBrZXkKKyAgICAgICAgICAgICAgICAvLyBhbmQgY2VydGlmaWNhdGVzCisgICAgICAgICAgICAgICAgaWYgKHBrY3MxMktleVN0b3JlLmlzS2V5RW50cnkoc0FsaWFzKSkgeworICAgICAgICAgICAgICAgIAlwa2NzMTJLZXlTdG9yZS5nZXRLZXkoc0FsaWFzLCBuZXcgY2hhcltdIHt9KTsKKyAgICAgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGVbXSBjZXJ0cyA9IHBrY3MxMktleVN0b3JlLmdldENlcnRpZmljYXRlQ2hhaW4oc0FsaWFzKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoY2VydHMgIT0gbnVsbCAmJiBjZXJ0cy5sZW5ndGggIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdktleVBhaXJBbGlhc2VzLmFkZChzQWxpYXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodktleVBhaXJBbGlhc2VzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBqbHRLZXlQYWlycy5zZXRMaXN0RGF0YSh2S2V5UGFpckFsaWFzZXMudG9BcnJheSgpKTsKKyAgICAgICAgICAgICAgICBqbHRLZXlQYWlycy5zZXRTZWxlY3RlZEluZGV4KDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gTm8ga2V5IHBhaXJzIGF2YWlsYWJsZS4uLgorICAgICAgICAgICAgICAgIGpsdEtleVBhaXJzLnNldExpc3REYXRhKG5ldyBTdHJpbmdbXSB7ICItLSBObyBrZXkgcGFpcnMgcHJlc2VudCBpbiB0aGUgQ3JlZGVudGlhbCBTdG9yZSAtLSIgfSk7CisgICAgICAgICAgICAgICAgamx0S2V5UGFpcnMuc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENNRXhjZXB0aW9uKCJQcm9ibGVtIG9jY3VyZWQgd2hpbGUgYWNjZXNzaW5nIFBLQ1MgIzEyIGtleXN0b3JlJ3MgZW50cmllcy4iLAorICAgICAgICAgICAgICAgIGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqICdDZXJ0aWZpY2F0ZSBEZXRhaWxzJyBidXR0b24gcHJlc3NlZC4gRGlzcGxheSB0aGUgc2VsZWN0ZWQga2V5CisgICAgICogcGFpcidzIGNlcnRpZmljYXRlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjZXJ0aWZpY2F0ZURldGFpbHNQcmVzc2VkKCkKKyAgICB7CisgICAgICAgIHRyeSB7ICAgICAgICAJCisgICAgICAgICAgICAKKyAgICAgICAgCVN0cmluZyBzQWxpYXMgPSAoU3RyaW5nKSBqbHRLZXlQYWlycy5nZXRTZWxlY3RlZFZhbHVlKCk7CisKKyAgICAgICAgICAgIGFzc2VydCBzQWxpYXMgIT0gbnVsbDsKKworICAgICAgICAgICAgLy9Db252ZXJ0IHRoZSBjZXJ0aWZpY2F0ZSBvYmplY3QgaW50byBhbiBYNTA5Q2VydGlmaWNhdGUgb2JqZWN0LgorICAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0ID0gQ01YNTA5VXRpbC5jb252ZXJ0Q2VydGlmaWNhdGUocGtjczEyS2V5U3RvcmUuZ2V0Q2VydGlmaWNhdGUoc0FsaWFzKSk7CisKKyAgICAgICAgICAgIC8vIFN1cHBseSB0aGUgY2VydGlmaWNhdGUgdG8gdGhlIHZpZXcgY2VydGlmaWNhdGUgZGlhbG9nCisgICAgICAgICAgICBWaWV3Q2VydERldGFpbHNEaWFsb2cgdmlld0NlcnRpZmljYXRlRGlhbG9nID0gbmV3IFZpZXdDZXJ0RGV0YWlsc0RpYWxvZyh0aGlzLAorICAgICAgICAgICAgCQkiQ2VydGlmaWNhdGUgZGV0YWlscyIsIAorICAgICAgICAgICAgCQl0cnVlLCAKKyAgICAgICAgICAgIAkJKFg1MDlDZXJ0aWZpY2F0ZSkgY2VydCwKKyAgICAgICAgICAgIAkJbnVsbCk7CisgICAgICAgICAgICB2aWV3Q2VydGlmaWNhdGVEaWFsb2cuc2V0TG9jYXRpb25SZWxhdGl2ZVRvKHRoaXMpOworICAgICAgICAgICAgdmlld0NlcnRpZmljYXRlRGlhbG9nLnNldFZpc2libGUodHJ1ZSk7CisgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgIAkKKyAgICAgICAgICAgIEpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gb2J0YWluIGNlcnRpZmljYXRlIGRldGFpbHMgdG8gc2hvdy4iLCAKKyAgICAgICAgICAgICAgICAgICAgIkNyZWRlbnRpYWwgTWFuYWdlciBBbGVydCIsCisgICAgICAgICAgICAgICAgICAgIEpPcHRpb25QYW5lLldBUk5JTkdfTUVTU0FHRSk7CisgICAgICAgICAgICBjbG9zZURpYWxvZygpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJbXBvcnQgYnV0dG9uIHByZXNzZWQgYnkgdXNlci4gU3RvcmUgdGhlIHNlbGVjdGVkIGtleSBwYWlyJ3MKKyAgICAgKiBwcml2YXRlIGFuZCBwdWJsaWMgcGFydHMgYW5kIHNlcnZpY2UgVVJMcyBhbmQgY2xvc2UgdGhlIGRpYWxvZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbXBvcnRQcmVzc2VkKCkKKyAgICB7CisgICAgCS8vIEdldCBTZXJ2aWNlIFVSTHMKKyAgICAJc2VydmljZVVSTHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAJRW51bWVyYXRpb248Pz4gVVJMcyA9ICgoKERlZmF1bHRMaXN0TW9kZWwpIGpsdFNlcnZpY2VVUkxzLmdldE1vZGVsKCkpLmVsZW1lbnRzKCkpOworICAgIAkgZm9yKCA7IFVSTHMuaGFzTW9yZUVsZW1lbnRzKCk7ICl7CisgICAgCQkgc2VydmljZVVSTHMuYWRkKChTdHJpbmcpIFVSTHMubmV4dEVsZW1lbnQoKSk7CisgICAgCSB9CisgICAgICAgIAkKKyAgICAgICAgU3RyaW5nIHNBbGlhcyA9IChTdHJpbmcpIGpsdEtleVBhaXJzLmdldFNlbGVjdGVkVmFsdWUoKTsKKworICAgICAgICBhc3NlcnQgc0FsaWFzICE9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByaXZhdGVLZXkgPSBwa2NzMTJLZXlTdG9yZS5nZXRLZXkoc0FsaWFzLCBuZXcgY2hhcltdIHt9KTsKKyAgICAgICAgICAgIGNlcnRpZmljYXRlQ2hhaW4gPSBwa2NzMTJLZXlTdG9yZS5nZXRDZXJ0aWZpY2F0ZUNoYWluKHNBbGlhcyk7CisgICAgICAgICAgICBhbGlhcyA9IHNBbGlhczsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyh0aGlzLAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGxvYWQgdGhlIHByaXZhdGUga2V5IGFuZCBjZXJ0aWZpY2F0ZSBjaGFpbiBmcm9tIFBLQ1MgIzEyIGZpbGUuIiwgCisgICAgICAgICAgICAgICAgICAgICJDcmVkZW50aWFsIE1hbmFnZXIgRXJyb3IiLAorICAgICAgICAgICAgICAgICAgICBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKyAgICAgICAgICAgIGNsb3NlRGlhbG9nKCk7CisgICAgICAgIH0KKworICAgICAgICBjbG9zZURpYWxvZygpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBBZGQgU2VydmljZSBVUkwgYnV0dG9uIHByZXNzZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkU2VydmljZVVSTFByZXNzZWQoKXsKKyAgICAJCisgICAgCS8vIERpc3BsYXkgdGhlIGRpYWxvZyBmb3IgZW50ZXJpbmcgc2VydmljZSBVUkwKKyAgICAJR2V0U2VydmljZVVSTERpYWxvZyBkR2V0U2VydmljZVVSTCA9IG5ldyBHZXRTZXJ2aWNlVVJMRGlhbG9nKHRoaXMsIHRydWUpOworICAgICAgICAKKyAgICAJZEdldFNlcnZpY2VVUkwuc2V0TG9jYXRpb25SZWxhdGl2ZVRvKHRoaXMpOworICAgIAlkR2V0U2VydmljZVVSTC5zZXRWaXNpYmxlKHRydWUpOworICAgIAkgICAgCQorICAgICAgICBTdHJpbmcgc1VSTCA9IGRHZXRTZXJ2aWNlVVJMLmdldFNlcnZpY2VVUkwoKTsKKyAgICAgICAgCisgICAgICAgIGlmIChzVVJMID09IG51bGwpeyAvLyB1c2VyIGNhbmNlbGxlZAorICAgICAgICAJcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoc1VSTC5sZW5ndGgoKSA9PSAwKXsgLy8gdXNlciBlbnRlcmVkIGFuIGVtcHR5IFVSTAorICAgICAgIAkJLy8gV2FybiB0aGUgdXNlcgorICAgICAgICAJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2coCisgICAgICAgICAgICAJCXRoaXMsIAorICAgICAgICAgICAgCQkiU2VydmljZSBVUkwgY2Fubm90IGJlIGVtcHR5IiwKKyAgICAgICAgCQkJIkNyZWRlbnRpYWwgTWFuYWdlciBBbGVydCIsCisgICAgICAgIAkJCUpPcHRpb25QYW5lLklORk9STUFUSU9OX01FU1NBR0UpOworICAgICAgICAJcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgIAkvLyBDaGVjayBpZiB0aGUgZW50ZXJlZCBVUkwgYWxyZWFkeSBleGlzdCBpbiB0aGUgVVJMIGxpc3QgZm9yIHRoaXMga2V5IGVudHJ5CisgICAgCWlmICgoKERlZmF1bHRMaXN0TW9kZWwpIGpsdFNlcnZpY2VVUkxzLmdldE1vZGVsKCkpLmNvbnRhaW5zKHNVUkwpKXsKKworICAgIAkJLy8gV2FybiB0aGUgdXNlcgorICAgICAgICAJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2coCisgICAgICAgICAgICAJCXRoaXMsIAorICAgICAgICAgICAgCQkiVGhlIGVudGVyZWQgVVJMIGFscmVhZHkgZXhpc3RzIGluIHRoZSBsaXN0IG9mIFVSTHMgZm9yIHRoaXMga2V5IHBhaXIgZW50cnkiLAorICAgICAgICAJCQkiQ3JlZGVudGlhbCBNYW5hZ2VyIEFsZXJ0IiwKKyAgICAgICAgCQkJSk9wdGlvblBhbmUuSU5GT1JNQVRJT05fTUVTU0FHRSk7CisgICAgICAgIAlyZXR1cm47CisgICAgCX0KKwkJCisJCS8vIENoZWNrIGlmIHRoZSBlbnRlcmVkIFVSTCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCBhbm90aGVyIGtleSBwYWlyIGVudHJ5IGluIHRoZSBLZXlzdG9yZSAgICAgICAJCisgICAgCUNyZWRlbnRpYWxNYW5hZ2VyIGNyZWRNYW5hZ2VyID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWNyZWRNYW5hZ2VyID0gQ3JlZGVudGlhbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKKwkJfSBjYXRjaCAoQ01FeGNlcHRpb24gY21lKSB7CisJCQkvLyBGYWlsZWQgdG8gaW5zdGFudGlhdGUgQ3JlZGVudGlhbCBNYW5hZ2VyIC0gd2FybiB0aGUgdXNlciBhbmQgZXhpdAorCQkJU3RyaW5nIHNNZXNzYWdlID0gIkZhaWxlZCB0byBpbnN0YW50aWF0ZSBDcmVkZW50aWFsIE1hbmFnZXIuICIgKyBjbWUuZ2V0TWVzc2FnZSgpOworCQkJY21lLnByaW50U3RhY2tUcmFjZSgpOworCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2cobmV3IEpGcmFtZSgpLCBzTWVzc2FnZSwKKwkJCQkJIkNyZWRlbnRpYWwgTWFuYWdlciBFcnJvciIsIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOworCQkJcmV0dXJuOworCQl9CisgICAgCS8vIEdldCB0aGUgbGlzdHMgb2YgVVJMcyBmb3IgdGhlIGFsaWFzCisgICAgCUhhc2hNYXA8U3RyaW5nLCBBcnJheUxpc3Q8U3RyaW5nPj4gc2VydmljZVVSTHNNYXAgPSBjcmVkTWFuYWdlci5nZXRTZXJ2aWNlVVJMc2ZvcktleVBhaXJzKCk7ICAgICAgIAkKKyAgICAJaWYgKHNlcnZpY2VVUkxzTWFwICE9IG51bGwpeyAvLyBzaG91bGQgbm90IGJlIG51bGwgcmVhbGx5IChhbHRob3VnaCBjYW4gYmUgZW1wdHkpLiBDaGVjayBhbnl3YXkuCisgICAgICAgIAlTZXQ8U3RyaW5nPiBhbGlhc2VzID0gc2VydmljZVVSTHNNYXAua2V5U2V0KCk7CisgICAgICAgIAlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaSA9IGFsaWFzZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICl7CisgICAgICAgIAkJU3RyaW5nIGFsaWFzID0gKFN0cmluZykgaS5uZXh0KCk7CisgICAgICAgIAkJLy8gQ2hlY2sgaWYgc2VydmljZSBVUkwgbGlzdCBmb3IgdGhpcyBhbGlhcyBjb250YWlucyB0aGUgbmV3bHkgZW50ZXJlZCBVUkwKKyAgICAgICAgCQlBcnJheUxpc3Q8U3RyaW5nPiB1cmxzID0gKEFycmF5TGlzdDxTdHJpbmc+KSBzZXJ2aWNlVVJMc01hcC5nZXQoYWxpYXMpOworICAgICAgICAJCWlmICh1cmxzLmNvbnRhaW5zKHNVUkwpKXsKKyAgICAgICAgICAgIAkJLy8gV2FybiB0aGUgdXNlciBhbmQgZXhpdAorICAgICAgICAgICAgICAgIAlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZygKKyAgICAgICAgICAgICAgICAgICAgCQl0aGlzLCAKKyAgICAgICAgICAgICAgICAgICAgCQkiVGhlIGVudGVyZWQgVVJMIGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIGFub3RoZXIga2V5IHBhaXIgZW50cnkiLAorICAgICAgICAgICAgICAgIAkJCSJDcmVkZW50aWFsIE1hbmFnZXIgQWxlcnQiLAorICAgICAgICAgICAgICAgIAkJCUpPcHRpb25QYW5lLklORk9STUFUSU9OX01FU1NBR0UpOworICAgICAgICAgICAgICAgIAlyZXR1cm47CisgICAgICAgIAkJfSAgICAJCQorICAgICAgICAJIH0KKyAgICAgICAJfQorICAgIAkKKwkJLy8gQ2hlY2sgaWYgdGhlIGVudGVyZWQgVVJMIGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIGEgcGFzc3dvcmQgZW50cnkgaW4gdGhlIEtleXN0b3JlCisvLyAgICAgICAJQXJyYXlMaXN0PFN0cmluZz4gdXJsTGlzdCA9IChBcnJheUxpc3Q8U3RyaW5nPikgKChDcmVkZW50aWFsTWFuYWdlclVJKSB0aGlzLmdldFBhcmVudCgpKS5nZXRVUkxzRm9yUGFzc3dvcmRzKCk7CisvLwkJLy8gQ2hlY2sgaWYgdGhpcyB1cmwgbGlzdCBjb250YWlucyB0aGUgbmV3bHkgZW50ZXJlZCB1cmwKKy8vCQlpZiAodXJsTGlzdC5jb250YWlucyhzVVJMKSl7CisvLyAgICAJCS8vIFdhcm4gdGhlIHVzZXIgYW5kIGV4aXQKKy8vICAgICAgICAJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2coCisvLyAgICAgICAgICAgIAkJdGhpcywgCisvLyAgICAgICAgICAgIAkJIlRoZSBlbnRlcmVkIFVSTCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCBhIHBhc3N3b3JkIGVudHJ5IiwKKy8vICAgICAgICAJCQkiQ3JlZGVudGlhbCBNYW5hZ2VyIEFsZXJ0IiwKKy8vICAgICAgICAJCQlKT3B0aW9uUGFuZS5JTkZPUk1BVElPTl9NRVNTQUdFKTsKKy8vICAgICAgICAJcmV0dXJuOworLy8JCX0gICAgCQorICAgIAkKKyAgICAJLy8gT3RoZXJ3aXNlIC0gdGhlIGVudGVyZWQgVVJMIGlzIG5vdCBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBlbnRyeSBpbiB0aGUgS2V5c3RvcmUsIAorCQkvLyBzbyBhZGQgdGhpcyBVUkwgdG8gdGhlIGxpc3Qgb2YgVVJMcyBmb3IgdGhpcyBrZXkgcGFpciBlbnRyeQorICAgICAgICAoKERlZmF1bHRMaXN0TW9kZWwpIGpsdFNlcnZpY2VVUkxzLmdldE1vZGVsKCkpLmFkZEVsZW1lbnQoc1VSTCk7CisgICAgICAgIGludCBpbmRleCA9ICgoRGVmYXVsdExpc3RNb2RlbCkgamx0U2VydmljZVVSTHMuZ2V0TW9kZWwoKSkuZ2V0U2l6ZSgpIC0gMTsKKyAgICAgICAgLy8gRWxlbWVudCBpcyBhcHBlbmRlZCB0byB0aGUgbGlzdCAtIGdldCBpdHMgaW5kZXgKKyAgICAgICAgamx0U2VydmljZVVSTHMuc2V0U2VsZWN0ZWRJbmRleChpbmRleCk7CisgICAgICAgIC8vIEluc3VyZSB0aGUgbmV3bHkgYWRkZWQgVVJMIGlzIHZpc2libGUKKyAgICAgICAgamx0U2VydmljZVVSTHMuZW5zdXJlSW5kZXhJc1Zpc2libGUoaW5kZXgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbmNlbCBidXR0b24gcHJlc3NlZCAtIGNsb3NlIHRoZSBkaWFsb2cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2FuY2VsUHJlc3NlZCgpCisgICAgeworICAgIAkvLyBzZXQgZXZlcnl0aGluZyB0byBudWxsLCBqdXN0IGluIGNhc2Ugc29tZSBvZiB0aGUgdmFsdWVzIGhhdmUgYmVlbiBzZXQgcHJldmlvdXNseSBhbmQKKyAgICAJLy8gdGhlIHVzZXIgcHJlc3NlZCAnY2FuY2VsJyBhZnRlciB0aGF0CisgICAgCXByaXZhdGVLZXkgPSBudWxsOworICAgIAljZXJ0aWZpY2F0ZUNoYWluID0gbnVsbDsKKyAgICAJc2VydmljZVVSTHMgPSBudWxsOworICAgICAgICBjbG9zZURpYWxvZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgZGlhbG9nLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjbG9zZURpYWxvZygpCisgICAgeworICAgICAgICBzZXRWaXNpYmxlKGZhbHNlKTsKKyAgICAgICAgZGlzcG9zZSgpOworICAgIH0KKyAgICAKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9uZXQvc2YvdGF2ZXJuYS90Mi93b3JrYmVuY2gvdWkvY3JlZGVudGlhbG1hbmFnZXIvTmV3S2V5UGFpclNlcnZpY2VEaWFsb2cuamF2YSBiL3NyYy9tYWluL2phdmEvbmV0L3NmL3RhdmVybmEvdDIvd29ya2JlbmNoL3VpL2NyZWRlbnRpYWxtYW5hZ2VyL05ld0tleVBhaXJTZXJ2aWNlRGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM0NGVhZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvbmV0L3NmL3RhdmVybmEvdDIvd29ya2JlbmNoL3VpL2NyZWRlbnRpYWxtYW5hZ2VyL05ld0tleVBhaXJTZXJ2aWNlRGlhbG9nLmphdmEKQEAgLTAsMCArMSwxNjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIFVuaXZlcnNpdHkgb2YgTWFuY2hlc3RlciAgIAorICogCisgKiAgTW9kaWZpY2F0aW9ucyB0byB0aGUgaW5pdGlhbCBjb2RlIGJhc2UgYXJlIGNvcHlyaWdodCBvZiB0aGVpcgorICogIHJlc3BlY3RpdmUgYXV0aG9ycywgb3IgdGhlaXIgZW1wbG95ZXJzIGFzIGFwcHJvcHJpYXRlLgorICogCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAgIAorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogICAgCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBuZXQuc2YudGF2ZXJuYS50Mi53b3JrYmVuY2gudWkuY3JlZGVudGlhbG1hbmFnZXI7CisKK2ltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7CitpbXBvcnQgamF2YS5hd3QuRmxvd0xheW91dDsKK2ltcG9ydCBqYXZhLmF3dC5Gb250OworaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OworaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOworaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0FkYXB0ZXI7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQ7CisKK2ltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOworaW1wb3J0IGphdmF4LnN3aW5nLkpEaWFsb2c7CitpbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOworaW1wb3J0IGphdmF4LnN3aW5nLkpMYWJlbDsKK2ltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7CitpbXBvcnQgamF2YXguc3dpbmcuSlRleHRGaWVsZDsKK2ltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuRW1wdHlCb3JkZXI7CisKKy8qKgorICogRGlhbG9nIHVzZWQgZm9yIGVudGVyaW5nIHNlcnZpY2UgdXJsLgorICogCisgKiBAYXV0aG9yIEFsZXggTmVuYWRpYworICovCitAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKK3B1YmxpYyBjbGFzcyBOZXdLZXlQYWlyU2VydmljZURpYWxvZyBleHRlbmRzIEpEaWFsb2cgeworCS8vIFNlcnZpY2UgVVJMIGVudHJ5IGZpZWxkIAorICAgIHByaXZhdGUgSlRleHRGaWVsZCBqdGZTZXJ2aWNlVVJMOworCisgICAgLy8gU3RvcmVzIHNlcnZpY2UgVVJMIGVudGVyZWQgCisgICAgcHJpdmF0ZSBTdHJpbmcgc1VSTCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIG5ldyBOZXdLZXlQYWlyU2VydmljZURpYWxvZyBkaWFsb2cgd2hlcmUgdGhlIHBhcmVudCBpcyBhIGZyYW1lLgorICAgICAqLworICAgIHB1YmxpYyBOZXdLZXlQYWlyU2VydmljZURpYWxvZyhKRnJhbWUgcGFyZW50LCBTdHJpbmcgdGl0bGUsIGJvb2xlYW4gbW9kYWwpCisgICAgeworICAgICAgICBzdXBlcihwYXJlbnQsIHRpdGxlLCBtb2RhbCk7CisgICAgICAgIGluaXRDb21wb25lbnRzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBuZXcgTmV3S2V5UGFpclNlcnZpY2VEaWFsb2cgZGlhbG9nIHdoZXJlIHRoZSBwYXJlbnQgaXMgYSBkaWFsb2cuCisgICAgICovCisgICAgcHVibGljIE5ld0tleVBhaXJTZXJ2aWNlRGlhbG9nKEpEaWFsb2cgcGFyZW50LCBTdHJpbmcgdGl0bGUsIGJvb2xlYW4gbW9kYWwpCisgICAgeworICAgICAgICBzdXBlcihwYXJlbnQsIHRpdGxlLCBtb2RhbCk7CisgICAgICAgIGluaXRDb21wb25lbnRzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzZXJ2aWNlIFVSTCBzZXQgaW4gdGhlIGRpYWxvZy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHNlcnZpY2UgVVJMIG9yIG51bGwgaWYgbm9uZSB3YXMgc2V0CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlVVJMKCkKKyAgICB7CisgICAgICAgICAgcmV0dXJuIHNVUkw7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGlzZSB0aGUgZGlhbG9nJ3MgR1VJIGNvbXBvbmVudHMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluaXRDb21wb25lbnRzKCkKKyAgICB7CisgICAgICAgIGdldENvbnRlbnRQYW5lKCkuc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7CisgICAgICAgIAorICAgICAgICBKTGFiZWwgamxEZXNjcmlwdGlvbiA9IG5ldyBKTGFiZWwoIkVudGVyIHRoZSBzZXJ2aWNlIFVSTCB0aGUga2V5IHBhaXIgd2lsbCBiZSBhc3NvY2lhdGVkIHRvIik7CisgICAgCWpsRGVzY3JpcHRpb24uc2V0Rm9udChuZXcgRm9udChudWxsLCBGb250LlBMQUlOLCAxMSkpOworICAgIAlqbERlc2NyaXB0aW9uLnNldEJvcmRlcihuZXcgRW1wdHlCb3JkZXIoNSw1LDUsNSkpOworICAgIAkKKyAgICAJSkxhYmVsIGpsU2VydmljZVVSTD0gbmV3IEpMYWJlbCgiU2VydmljZSBVUkwiKTsKKyAgICAgICAganRmU2VydmljZVVSTCA9IG5ldyBKVGV4dEZpZWxkKDE1KTsKKworICAgICAgICBKQnV0dG9uIGpiT0sgPSBuZXcgSkJ1dHRvbigiT0siKTsKKyAgICAgICAgamJPSy5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZ0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9rUHJlc3NlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBKQnV0dG9uIGpiQ2FuY2VsID0gbmV3IEpCdXR0b24oIkNhbmNlbCIpOworICAgICAgICBqYkNhbmNlbC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZ0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhbmNlbFByZXNzZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgSlBhbmVsIGpwU2VydmljZVVSTCA9IG5ldyBKUGFuZWwobmV3IEZsb3dMYXlvdXQoRmxvd0xheW91dC5DRU5URVIpKTsKKyAgICAgICAganBTZXJ2aWNlVVJMLmFkZChqbFNlcnZpY2VVUkwpOworICAgICAgICBqcFNlcnZpY2VVUkwuYWRkKGp0ZlNlcnZpY2VVUkwpOworICAgICAgICBqcFNlcnZpY2VVUkwuc2V0Qm9yZGVyKG5ldyBFbXB0eUJvcmRlcig1LCA1LCA1LCA1KSk7CisKKyAgICAgICAgSlBhbmVsIGpwQnV0dG9ucyA9IG5ldyBKUGFuZWwobmV3IEZsb3dMYXlvdXQoRmxvd0xheW91dC5DRU5URVIpKTsKKyAgICAgICAganBCdXR0b25zLmFkZChqYk9LKTsKKyAgICAgICAganBCdXR0b25zLmFkZChqYkNhbmNlbCk7CisKKyAgICAJZ2V0Q29udGVudFBhbmUoKS5hZGQoamxEZXNjcmlwdGlvbiwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKKyAgICAgICAgZ2V0Q29udGVudFBhbmUoKS5hZGQoanBTZXJ2aWNlVVJMLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKyAgICAgICAgZ2V0Q29udGVudFBhbmUoKS5hZGQoanBCdXR0b25zLCBCb3JkZXJMYXlvdXQuU09VVEgpOworCisgICAgICAgIGFkZFdpbmRvd0xpc3RlbmVyKG5ldyBXaW5kb3dBZGFwdGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dFdmVudCBldnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xvc2VEaWFsb2coKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgc2V0UmVzaXphYmxlKGZhbHNlKTsKKworICAgICAgICBnZXRSb290UGFuZSgpLnNldERlZmF1bHRCdXR0b24oamJPSyk7CisKKyAgICAgICAgcGFjaygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9LIGJ1dHRvbiBwcmVzc2VkIG9yIG90aGVyd2lzZSBhY3RpdmF0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIG9rUHJlc3NlZCgpCisgICAgeworICAgICAgICBzVVJMID0ganRmU2VydmljZVVSTC5nZXRUZXh0KCk7CisgICAgICAgIGNsb3NlRGlhbG9nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FuY2VsIGJ1dHRvbiBwcmVzc2VkIG9yIG90aGVyd2lzZSBhY3RpdmF0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNhbmNlbFByZXNzZWQoKQorICAgIHsKKyAgICAgICAJLy8gU2V0IHNVUkwgZmllbGQgdG8gbnVsbCBhcyBpdCBtaWdodCBoYXZlIGNoYW5nZWQgaW4gdGhlIG1lYW50aW1lCisgICAgCS8vIGlmIHVzZXIgZW50ZXJlZCBzb21lIHZhbHVlIHRoYW4gcHJlc3NlZCBjYW5jZWwgbGF0ZXIgb24KKyAgICAJc1VSTCA9IG51bGw7ICAgICAgIAorICAgIAljbG9zZURpYWxvZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBkaWFsb2cuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNsb3NlRGlhbG9nKCkKKyAgICB7CisgICAgICAgIHNldFZpc2libGUoZmFsc2UpOworICAgICAgICBkaXNwb3NlKCk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL25ldC9zZi90YXZlcm5hL3QyL3dvcmtiZW5jaC91aS9jcmVkZW50aWFsbWFuYWdlci9OZXdUcnVzdENlcnRzRGlhbG9nLmphdmEgYi9zcmMvbWFpbi9qYXZhL25ldC9zZi90YXZlcm5hL3QyL3dvcmtiZW5jaC91aS9jcmVkZW50aWFsbWFuYWdlci9OZXdUcnVzdENlcnRzRGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMxNGI2MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvbmV0L3NmL3RhdmVybmEvdDIvd29ya2JlbmNoL3VpL2NyZWRlbnRpYWxtYW5hZ2VyL05ld1RydXN0Q2VydHNEaWFsb2cuamF2YQpAQCAtMCwwICsxLDI5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgVW5pdmVyc2l0eSBvZiBNYW5jaGVzdGVyICAgCisgKiAKKyAqICBNb2RpZmljYXRpb25zIHRvIHRoZSBpbml0aWFsIGNvZGUgYmFzZSBhcmUgY29weXJpZ2h0IG9mIHRoZWlyCisgKiAgcmVzcGVjdGl2ZSBhdXRob3JzLCBvciB0aGVpciBlbXBsb3llcnMgYXMgYXBwcm9wcmlhdGUuCisgKiAKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogICAgCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAgICAKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG5ldC5zZi50YXZlcm5hLnQyLndvcmtiZW5jaC51aS5jcmVkZW50aWFsbWFuYWdlcjsKKworaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKK2ltcG9ydCBqYXZhLmF3dC5GbG93TGF5b3V0OworaW1wb3J0IGphdmEuYXd0LkZvbnQ7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93QWRhcHRlcjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dFdmVudDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbDsKK2ltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOworaW1wb3J0IGphdmF4LnN3aW5nLkpEaWFsb2c7CitpbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOworaW1wb3J0IGphdmF4LnN3aW5nLkpMYWJlbDsKK2ltcG9ydCBqYXZheC5zd2luZy5KTGlzdDsKK2ltcG9ydCBqYXZheC5zd2luZy5KT3B0aW9uUGFuZTsKK2ltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7CitpbXBvcnQgamF2YXguc3dpbmcuSlNjcm9sbFBhbmU7CitpbXBvcnQgamF2YXguc3dpbmcuQm94TGF5b3V0OworaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbDsKK2ltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuQ29tcG91bmRCb3JkZXI7CitpbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkVtcHR5Qm9yZGVyOworaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5FdGNoZWRCb3JkZXI7CitpbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdFNlbGVjdGlvbkV2ZW50OworaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lkxpc3RTZWxlY3Rpb25MaXN0ZW5lcjsKKworaW1wb3J0IG5ldC5zZi50YXZlcm5hLnQyLnNlY3VyaXR5LmNyZWRlbnRpYWxtYW5hZ2VyLkNNWDUwOVV0aWw7CitpbXBvcnQgbmV0LnNmLnRhdmVybmEudDIud29ya2JlbmNoLnVpLmNyZWRlbnRpYWxtYW5hZ2VyLlZpZXdDZXJ0RGV0YWlsc0RpYWxvZzsKKworLyoqCisgKiBEaWFsb2cgdGhhdCBkaXNwbGF5cyB0aGUgZGV0YWlscyBvZiBhbGwgdHJ1c3RlZCBjZXJ0aWZpY2F0ZXMKKyAqIGtleXN0b3JlIGFsbG93aW5nIHRoZSB1c2VyIHRvIHBpY2sgb25lIG9yIG1vcmUgZm9yIGltcG9ydC4KKyAqIAorICogQGF1dGhvciBBbGV4IE5lbmFkaWMKKyAqLworY2xhc3MgTmV3VHJ1c3RDZXJ0c0RpYWxvZworICAgIGV4dGVuZHMgSkRpYWxvZworeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODcwMjk1NzYzNTE4ODY0Mzk5M0w7CisKKwkvKiogTGlzdCBvZiB0cnVzdGVkIGNlcnRzIGF2YWlsYWJsZSBmb3IgaW1wb3J0ICovCisgICAgcHJpdmF0ZSBKTGlzdCBqbHRUcnVzdENlcnRzOworCisgICAgLyoqIExpc3Qgb2YgdHJ1c3RlZCBjZXJ0cyBhdmFpbGFibGUgZm9yIGltcG9ydCAqLworICAgIHByaXZhdGUgQXJyYXlMaXN0PFg1MDlDZXJ0aWZpY2F0ZT4gYXZhaWxhYmxlVHJ1c3RDZXJ0cyA9IG5ldyBBcnJheUxpc3Q8WDUwOUNlcnRpZmljYXRlPigpOworICAgIAorICAgIC8qKiBMaXN0IG9mIHRydXN0ZWQgY2VydHMgc2VsZWN0ZWQgZm9yIGltcG9ydCAqLworICAgIHByaXZhdGUgQXJyYXlMaXN0PFg1MDlDZXJ0aWZpY2F0ZT4gc2VsZWN0ZWRUcnVzdENlcnRzOworICAgIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgbmV3IGZvcm0gTmV3VHJ1c3RDZXJ0c0RpYWxvZyB3aGVyZSB0aGUgcGFyZW50IGlzIGEgZnJhbWUuCisgICAgICovCisgICAgcHVibGljIE5ld1RydXN0Q2VydHNEaWFsb2coSkZyYW1lIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBib29sZWFuIG1vZGFsLCBBcnJheUxpc3Q8WDUwOUNlcnRpZmljYXRlPiBsQ2VydHMpCisgICAgeworICAgICAgICBzdXBlcihwYXJlbnQsIHRpdGxlLCBtb2RhbCk7CisgICAgICAgIC8vU3lzdGVtLmFycmF5Y29weShsQ2VydHMsIDAsIHRydXN0Q2VydHMsIDAsIGxDZXJ0cy5sZW5ndGgpOworICAgICAgICBhdmFpbGFibGVUcnVzdENlcnRzID0gbENlcnRzOworICAgICAgICBpbml0Q29tcG9uZW50cygpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIG5ldyBmb3JtIE5ld1RydXN0Q2VydHNEaWFsb2cgd2hlcmUgdGhlIHBhcmVudCBpcyBhIGZyYW1lLgorICAgICAqLworICAgIHB1YmxpYyBOZXdUcnVzdENlcnRzRGlhbG9nKEpEaWFsb2cgcGFyZW50LCBTdHJpbmcgdGl0bGUsIGJvb2xlYW4gbW9kYWwsIEFycmF5TGlzdDxYNTA5Q2VydGlmaWNhdGU+IGxDZXJ0cykKKyAgICB7CisgICAgICAgIHN1cGVyKHBhcmVudCwgdGl0bGUsIG1vZGFsKTsKKyAgICAgICAgLy9TeXN0ZW0uYXJyYXljb3B5KGxDZXJ0cywgMCwgdHJ1c3RDZXJ0cywgMCwgbENlcnRzLmxlbmd0aCk7CisgICAgICAgIGF2YWlsYWJsZVRydXN0Q2VydHMgPSBsQ2VydHM7CisgICAgICAgIGluaXRDb21wb25lbnRzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGlzZSB0aGUgZGlhbG9nJ3MgR1VJIGNvbXBvbmVudHMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluaXRDb21wb25lbnRzKCkKKyAgICB7CisgICAgICAgIC8vIEluc3RydWN0aW9ucworICAgICAgICBKTGFiZWwgamxJbnN0cnVjdGlvbnMgPSBuZXcgSkxhYmVsKCJTZWxlY3Qgb25lIG9yIG1vcmUgY2VydGlmaWNhdGVzIGZvciBpbXBvcnQ6Iik7CisgICAgICAgIGpsSW5zdHJ1Y3Rpb25zLnNldEZvbnQobmV3IEZvbnQobnVsbCwgRm9udC5QTEFJTiwgMTEpKTsKKyAgICAgICAgamxJbnN0cnVjdGlvbnMuc2V0Qm9yZGVyKG5ldyBFbXB0eUJvcmRlcig1LDUsNSw1KSk7CisgICAgICAgIEpQYW5lbCBqcEluc3RydWN0aW9ucyA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKKyAgICAgICAganBJbnN0cnVjdGlvbnMuYWRkKGpsSW5zdHJ1Y3Rpb25zLCBCb3JkZXJMYXlvdXQuV0VTVCk7CisKKyAgICAgICAgLy8gSW1wb3J0IGJ1dHRvbgorICAgICAgICBmaW5hbCBKQnV0dG9uIGpiSW1wb3J0ID0gbmV3IEpCdXR0b24oIkltcG9ydCIpOworICAgICAgICBqYkltcG9ydC5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgamJJbXBvcnQuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbXBvcnRQcmVzc2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIC8vIENlcnRpZmljYXRlIGRldGFpbHMgYnV0dG9uCisgICAgICAgIGZpbmFsIEpCdXR0b24gamJDZXJ0aWZpY2F0ZURldGFpbHMgPSBuZXcgSkJ1dHRvbigiQ2VydGlmaWNhdGUgRGV0YWlscyIpOworICAgICAgICBqYkNlcnRpZmljYXRlRGV0YWlscy5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgamJDZXJ0aWZpY2F0ZURldGFpbHMuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZURldGFpbHNQcmVzc2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIC8vIExpc3QgdG8gaG9sZCB0cnVzdGVkIGNlcnRzJyBhbGlhc2VzCisgICAgICAgIGpsdFRydXN0Q2VydHMgPSBuZXcgSkxpc3QoKTsKKyAgICAgICAgamx0VHJ1c3RDZXJ0cy5zZXRTZWxlY3Rpb25Nb2RlKExpc3RTZWxlY3Rpb25Nb2RlbC5NVUxUSVBMRV9JTlRFUlZBTF9TRUxFQ1RJT04gKTsKKyAgICAgICAgamx0VHJ1c3RDZXJ0cy5hZGRMaXN0U2VsZWN0aW9uTGlzdGVuZXIobmV3IExpc3RTZWxlY3Rpb25MaXN0ZW5lcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZChMaXN0U2VsZWN0aW9uRXZlbnQgZXZ0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgCQorICAgICAgICAgICAgICAgIGlmIChqbHRUcnVzdENlcnRzLmdldFNlbGVjdGVkSW5kZXgoKSA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBqYkltcG9ydC5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgamJDZXJ0aWZpY2F0ZURldGFpbHMuc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBqYkltcG9ydC5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgICAgICBqYkNlcnRpZmljYXRlRGV0YWlscy5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIC8vIFBvcHVsYXRlIHRoZSBsaXN0CisgICAgICAgIC8vIEdldCB0aGUgY2VydGlmaWNhdGUgc3ViamVjdHMnIENOcworICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBjbnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdmFpbGFibGVUcnVzdENlcnRzLnNpemUoKTsgaSsrKXsKKyAgICAgICAgCQorICAgIAkJU3RyaW5nIEROID0gKChYNTA5Q2VydGlmaWNhdGUpIGF2YWlsYWJsZVRydXN0Q2VydHMuZ2V0KGkpKS5nZXRTdWJqZWN0WDUwMFByaW5jaXBhbCgpLmdldE5hbWUoWDUwMFByaW5jaXBhbC5SRkMyMjUzKTsKKyAgICAJCUNNWDUwOVV0aWwgdXRpbCA9IG5ldyBDTVg1MDlVdGlsKCk7CisgICAgCQl1dGlsLnBhcnNlRE4oRE4pOworICAgIAkJCisgICAgICAgIAlTdHJpbmcgQ04gPSB1dGlsLmdldENOKCk7CisgICAgICAgIAljbnMuYWRkKGksIENOKTsKKyAgICAgICAgfQorICAgICAgICBqbHRUcnVzdENlcnRzLnNldExpc3REYXRhKGNucy50b0FycmF5KCkpOworICAgICAgICBqbHRUcnVzdENlcnRzLnNldFNlbGVjdGVkSW5kZXgoMCk7CisKKyAgICAgICAgLy8gUHV0IHRoZSBsaXN0IGludG8gYSBzY3JvbGwgcGFuZQorICAgICAgICBKU2Nyb2xsUGFuZSBqc3BUcnVzdENlcnRzID0gbmV3IEpTY3JvbGxQYW5lKGpsdFRydXN0Q2VydHMsCisgICAgICAgICAgICBKU2Nyb2xsUGFuZS5WRVJUSUNBTF9TQ1JPTExCQVJfQVNfTkVFREVELAorICAgICAgICAgICAgSlNjcm9sbFBhbmUuSE9SSVpPTlRBTF9TQ1JPTExCQVJfQVNfTkVFREVEKTsKKyAgICAgICAganNwVHJ1c3RDZXJ0cy5nZXRWaWV3cG9ydCgpLnNldEJhY2tncm91bmQoamx0VHJ1c3RDZXJ0cy5nZXRCYWNrZ3JvdW5kKCkpOworICAgICAgICAKKyAgICAgICAgLy8gUHV0IGFsbCB0aGUgdHJ1c3RlZCBjZXJ0IGNvbXBvbmVudHMgdG9nZXRoZXIKKyAgICAgICAgSlBhbmVsIGpwVHJ1c3RDZXJ0cyA9IG5ldyBKUGFuZWwoKTsgLy8gQm94TGF5b3V0CisgICAgICAgIGpwVHJ1c3RDZXJ0cy5zZXRMYXlvdXQobmV3IEJveExheW91dChqcFRydXN0Q2VydHMsIEJveExheW91dC5ZX0FYSVMpKTsKKyAgICAgICAgLy9qcEtleVBhaXJzLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbig0MDAsIDIwMCkpOworICAgICAgICBqcFRydXN0Q2VydHMuc2V0Qm9yZGVyKG5ldyBDb21wb3VuZEJvcmRlcihuZXcgQ29tcG91bmRCb3JkZXIoCisgICAgICAgICAgICBuZXcgRW1wdHlCb3JkZXIoNSwgNSwgNSwgNSksIG5ldyBFdGNoZWRCb3JkZXIoKSksIG5ldyBFbXB0eUJvcmRlcigKKyAgICAgICAgICAgIDUsIDUsIDUsIDUpKSk7CisgICAKKyAgICAgICAganBJbnN0cnVjdGlvbnMuc2V0QWxpZ25tZW50WShKUGFuZWwuTEVGVF9BTElHTk1FTlQpOworICAgICAgICBqcFRydXN0Q2VydHMuYWRkKGpwSW5zdHJ1Y3Rpb25zKTsKKyAgICAgICAganNwVHJ1c3RDZXJ0cy5zZXRBbGlnbm1lbnRZKEpQYW5lbC5MRUZUX0FMSUdOTUVOVCk7CisgICAgICAgIGpwVHJ1c3RDZXJ0cy5hZGQoanNwVHJ1c3RDZXJ0cyk7CisgICAgICAgIGpiQ2VydGlmaWNhdGVEZXRhaWxzLnNldEFsaWdubWVudFkoSlBhbmVsLlJJR0hUX0FMSUdOTUVOVCk7CisgICAgICAgIGpwVHJ1c3RDZXJ0cy5hZGQoamJDZXJ0aWZpY2F0ZURldGFpbHMpOworCisgICAgICAgIC8vIENhbmNlbCBidXR0b24KKyAgICAgICAgZmluYWwgSkJ1dHRvbiBqYkNhbmNlbCA9IG5ldyBKQnV0dG9uKCJDYW5jZWwiKTsKKyAgICAgICAgamJDYW5jZWwuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYW5jZWxQcmVzc2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIEpQYW5lbCBqcEJ1dHRvbnMgPSBuZXcgSlBhbmVsKG5ldyBGbG93TGF5b3V0KEZsb3dMYXlvdXQuQ0VOVEVSKSk7CisgICAgICAgIGpwQnV0dG9ucy5hZGQoamJJbXBvcnQpOworICAgICAgICBqcEJ1dHRvbnMuYWRkKGpiQ2FuY2VsKTsKKworICAgICAgICBnZXRDb250ZW50UGFuZSgpLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOworICAgICAgICBnZXRDb250ZW50UGFuZSgpLmFkZChqcFRydXN0Q2VydHMsIEJvcmRlckxheW91dC5DRU5URVIpOworICAgICAgICBnZXRDb250ZW50UGFuZSgpLmFkZChqcEJ1dHRvbnMsIEJvcmRlckxheW91dC5TT1VUSCk7CisKKyAgICAgICAgYWRkV2luZG93TGlzdGVuZXIobmV3IFdpbmRvd0FkYXB0ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aW5kb3dDbG9zaW5nKFdpbmRvd0V2ZW50IGV2dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbG9zZURpYWxvZygpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBzZXRSZXNpemFibGUoZmFsc2UpOworCisgICAgICAgIGdldFJvb3RQYW5lKCkuc2V0RGVmYXVsdEJ1dHRvbihqYkltcG9ydCk7CisKKyAgICAgICAgcGFjaygpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogQ2VydGlmaWNhdGUgRGV0YWlscyBidXR0b24gcHJlc3NlZC4gIERpc3BsYXkgdGhlIHNlbGVjdGVkIGtleQorICAgICAqIHBhaXIncyBjZXJ0aWZpY2F0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2VydGlmaWNhdGVEZXRhaWxzUHJlc3NlZCgpCisgICAgeworICAgICAgICB0cnkgeyAgICAgICAgCQorICAgICAgICAJCisgICAgICAgIAlpbnQgaSA9IGpsdFRydXN0Q2VydHMuZ2V0U2VsZWN0ZWRJbmRleCgpOworICAgICAgICAgICAgCisgICAgICAgIAlYNTA5Q2VydGlmaWNhdGUgY2VydCA9IChYNTA5Q2VydGlmaWNhdGUpIGF2YWlsYWJsZVRydXN0Q2VydHMuZ2V0KGkpOworCisgICAgICAgICAgICAvLyBTdXBwbHkgdGhlIGNlcnRpZmljYXRlIHRvIHRoZSB2aWV3IGNlcnRpZmljYXRlIGRpYWxvZworICAgICAgICAgICAgVmlld0NlcnREZXRhaWxzRGlhbG9nIHZpZXdDZXJ0aWZpY2F0ZURpYWxvZyA9IG5ldyBWaWV3Q2VydERldGFpbHNEaWFsb2codGhpcywKKyAgICAgICAgICAgIAkJIkNlcnRpZmljYXRlIGRldGFpbHMiLCAKKyAgICAgICAgICAgIAkJdHJ1ZSwgCisgICAgICAgICAgICAJCWNlcnQsCisgICAgICAgICAgICAJCW51bGwpOworICAgICAgICAgICAgdmlld0NlcnRpZmljYXRlRGlhbG9nLnNldExvY2F0aW9uUmVsYXRpdmVUbyh0aGlzKTsKKyAgICAgICAgICAgIHZpZXdDZXJ0aWZpY2F0ZURpYWxvZy5zZXRWaXNpYmxlKHRydWUpOworICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcywKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBvYnRhaW4gY2VydGlmaWNhdGUgZGV0YWlscyB0byBzaG93LiIsIAorICAgICAgICAgICAgICAgICAgICAiQ3JlZGVudGlhbCBNYW5hZ2VyIEFsZXJ0IiwKKyAgICAgICAgICAgICAgICAgICAgSk9wdGlvblBhbmUuV0FSTklOR19NRVNTQUdFKTsKKyAgICAgICAgICAgIGNsb3NlRGlhbG9nKCk7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdHJ1c3RlZCBjZXJ0aWZpY2F0ZXMgc2VsZWN0ZWQgZm9yIGltcG9ydC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGFycmF5IG9mIHRydXN0ZWQgY2VydGlmaWNhdGVzIHNlbGVjdGVkIGZvciBpbXBvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgQXJyYXlMaXN0PFg1MDlDZXJ0aWZpY2F0ZT4gZ2V0VHJ1c3RlZENlcnRpZmljYXRlcygpCisgICAgeworICAgIAlyZXR1cm4gc2VsZWN0ZWRUcnVzdENlcnRzOworICAgIH0KKworICAgCisgICAgLyoqCisgICAgICogSW1wb3J0IGJ1dHRvbiBwcmVzc2VkIGJ5IHVzZXIuIFN0b3JlIHRoZSBzZWxlY3RlZCB0cnVzdGVkIGNlcnRzCisgICAgICogYW5kIGNsb3NlIHRoZSBkaWFsb2cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW1wb3J0UHJlc3NlZCgpCisgICAgeworICAgIAlpbnRbXSBzZWxlY3RlZFZhbHVlcyA9IGpsdFRydXN0Q2VydHMuZ2V0U2VsZWN0ZWRJbmRpY2VzKCk7CisgICAgCXNlbGVjdGVkVHJ1c3RDZXJ0cyA9IG5ldyBBcnJheUxpc3Q8WDUwOUNlcnRpZmljYXRlPigpOworICAgIAlmb3IgKGludCBpPSAwOyBpIDwgc2VsZWN0ZWRWYWx1ZXMubGVuZ3RoOyBpKyspeworICAgIAkJc2VsZWN0ZWRUcnVzdENlcnRzLmFkZChhdmFpbGFibGVUcnVzdENlcnRzLmdldChzZWxlY3RlZFZhbHVlc1tpXSkpOworICAgIAl9CisKKyAgICAgICAgY2xvc2VEaWFsb2coKTsKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBDYW5jZWwgYnV0dG9uIHByZXNzZWQgLSBjbG9zZSB0aGUgZGlhbG9nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNhbmNlbFByZXNzZWQoKQorICAgIHsKKyAgICAJLy8gU2V0IHNlbGVjdGVkVHJ1c3RDZXJ0cyB0byBudWxsIHRvIGluZGljYXRlIHRoYXQgdXNlciBjYW5jZWxsZWQKKyAgICAJc2VsZWN0ZWRUcnVzdENlcnRzID0gbnVsbDsKKyAgICAgICAgY2xvc2VEaWFsb2coKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIGRpYWxvZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2xvc2VEaWFsb2coKQorICAgIHsKKyAgICAgICAgc2V0VmlzaWJsZShmYWxzZSk7CisgICAgICAgIGRpc3Bvc2UoKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvbmV0L3NmL3RhdmVybmEvdDIvd29ya2JlbmNoL3VpL2NyZWRlbnRpYWxtYW5hZ2VyL1Bhc3N3b3Jkc1RhYmxlTW9kZWwuamF2YSBiL3NyYy9tYWluL2phdmEvbmV0L3NmL3RhdmVybmEvdDIvd29ya2JlbmNoL3VpL2NyZWRlbnRpYWxtYW5hZ2VyL1Bhc3N3b3Jkc1RhYmxlTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTViOTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9uZXQvc2YvdGF2ZXJuYS90Mi93b3JrYmVuY2gvdWkvY3JlZGVudGlhbG1hbmFnZXIvUGFzc3dvcmRzVGFibGVNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMjI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBVbml2ZXJzaXR5IG9mIE1hbmNoZXN0ZXIgICAKKyAqIAorICogIE1vZGlmaWNhdGlvbnMgdG8gdGhlIGluaXRpYWwgY29kZSBiYXNlIGFyZSBjb3B5cmlnaHQgb2YgdGhlaXIKKyAqICByZXNwZWN0aXZlIGF1dGhvcnMsIG9yIHRoZWlyIGVtcGxveWVycyBhcyBhcHByb3ByaWF0ZS4KKyAqIAorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAgICAKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqICAgIAorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2UgbmV0LnNmLnRhdmVybmEudDIud29ya2JlbmNoLnVpLmNyZWRlbnRpYWxtYW5hZ2VyOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKKworaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKK2ltcG9ydCBqYXZheC5zd2luZy5KT3B0aW9uUGFuZTsKK2ltcG9ydCBqYXZheC5zd2luZy50YWJsZS5BYnN0cmFjdFRhYmxlTW9kZWw7CisKK2ltcG9ydCBuZXQuc2YudGF2ZXJuYS50Mi5sYW5nLm9ic2VydmVyLk9ic2VydmFibGU7CitpbXBvcnQgbmV0LnNmLnRhdmVybmEudDIubGFuZy5vYnNlcnZlci5PYnNlcnZlcjsKK2ltcG9ydCBuZXQuc2YudGF2ZXJuYS50Mi5zZWN1cml0eS5jcmVkZW50aWFsbWFuYWdlci5DTUV4Y2VwdGlvbjsKK2ltcG9ydCBuZXQuc2YudGF2ZXJuYS50Mi5zZWN1cml0eS5jcmVkZW50aWFsbWFuYWdlci5DcmVkZW50aWFsTWFuYWdlcjsKK2ltcG9ydCBuZXQuc2YudGF2ZXJuYS50Mi5zZWN1cml0eS5jcmVkZW50aWFsbWFuYWdlci5LZXlzdG9yZUNoYW5nZWRFdmVudDsKK2ltcG9ydCBuZXQuc2YudGF2ZXJuYS50Mi53b3JrYmVuY2gudWkuY3JlZGVudGlhbG1hbmFnZXIuQ3JlZGVudGlhbE1hbmFnZXJVSTsKKworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOworCisvKioKKyAqIFRoZSB0YWJsZSBtb2RlbCB1c2VkIHRvIGRpc3BsYXkgdGhlIEtleXN0b3JlJ3MgdXNlcm5hbWUvcGFzc3dvcmQgCisgKiBwYWlyIGVudHJpZXMuCisgKiAKKyAqIEBhdXRob3IgQWxleCBOZW5hZGljCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQorcHVibGljIGNsYXNzIFBhc3N3b3Jkc1RhYmxlTW9kZWwgZXh0ZW5kcyBBYnN0cmFjdFRhYmxlTW9kZWwgaW1wbGVtZW50cyBPYnNlcnZlcjxLZXlzdG9yZUNoYW5nZWRFdmVudD4geworCisJLy8gQ29sdW1uIG5hbWVzIAorICAgIHByaXZhdGUgU3RyaW5nW10gY29sdW1uTmFtZXM7CisKKyAgICAvLyBUYWJsZSBkYXRhCisgICAgcHJpdmF0ZSBPYmplY3RbXVtdIGRhdGE7CisKKwlwcml2YXRlIENyZWRlbnRpYWxNYW5hZ2VyIGNyZWRNYW5hZ2VyOworCQorCXByaXZhdGUgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoUGFzc3dvcmRzVGFibGVNb2RlbC5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgUGFzc3dvcmRzVGFibGVNb2RlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGFzc3dvcmRzVGFibGVNb2RlbCgpeworICAgIAkKKyAgICAgICAgY3JlZE1hbmFnZXIgPSBudWxsOworICAgICAgICB0cnl7CisgICAgICAgIAljcmVkTWFuYWdlciA9IENyZWRlbnRpYWxNYW5hZ2VyLmdldEluc3RhbmNlKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKENNRXhjZXB0aW9uIGNtZSl7CisJCQkvLyBGYWlsZWQgdG8gaW5zdGFudGlhdGUgQ3JlZGVudGlhbCBNYW5hZ2VyIC0gd2FybiB0aGUgdXNlciBhbmQgZXhpdAorCQkJU3RyaW5nIHNNZXNzYWdlID0gIkZhaWxlZCB0byBpbnN0YW50aWF0ZSBDcmVkZW50aWFsIE1hbmFnZXIuICIgKyBjbWUuZ2V0TWVzc2FnZSgpOworCQkJbG9nZ2VyLmVycm9yKCJDTSBHVUk6ICIrIHNNZXNzYWdlKTsKKwkJCWNtZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKG5ldyBKRnJhbWUoKSwgc01lc3NhZ2UsCisJCQkJCSJDcmVkZW50aWFsIE1hbmFnZXIgRXJyb3IiLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKwkJCXJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAJZGF0YSA9IG5ldyBPYmplY3RbMF1bMF07CisgICAgICAgIGNvbHVtbk5hbWVzID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICAgICAiRW50cnkgVHlwZSIsIC8vIHR5cGUgb2YgdGhlIEtleXN0b3JlIGVudHJ5CisgICAgICAgICAgICAgICAgIlNlcnZpY2UgVVJMIiwgLy8gdGhlIHNlcnZpY2UgdXJsLCBwYXJ0IG9mIHRoZSBhY3R1YWwgYWxpYXMgaW4gdGhlIEtleXN0b3JlCisgICAgICAgICAgICAgICAgIlVzZXJuYW1lIiwgLy8gdXNlcm5hbWUgZm9yIHRoZSBzZXJ2aWNlLCBwYXJ0IG9mIHRoZSBwYXNzd29yZCBlbnRyeSBpbiB0aGUgS2V5c3RvcmUKKyAgICAgICAgICAgICAgICAiTGFzdCBNb2RpZmllZCIsIC8vIGxhc3QgbW9kaWZpZWQgZGF0ZSBvZiB0aGUgZW50cnkKKyAgICAgICAgICAgICAgICAiUGFzc3dvcmQiLCAvLyB0aGUgaW52aXNpYmxlIGNvbHVtbiBob2xkaW5nIHRoZSBwYXNzd29yZCB2YWx1ZSBvZiB0aGUgcGFzc3dvcmQgZW50cnkgaW4gdGhlIEtleXN0b3JlCisgICAgICAgIAkJIkFsaWFzIiAvLyB0aGUgaW52aXNpYmxlIGNvbHVtbiBob2xkaW5nIHRoZSBLZXlzdG9yZSBhbGlhcyBvZiB0aGUgZW50cnkKKyAgICAgICAgfTsKKyAgICAgICAgCisgICAgICAgIHRyeSB7CisJCQlsb2FkKCk7CisJCX0gY2F0Y2ggKENNRXhjZXB0aW9uIGNtZSkgeworCQkJU3RyaW5nIHNNZXNzYWdlID0gIkZhaWxlZCB0byBsb2FkIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBwYWlycyI7CisJCQlsb2dnZXIuZXJyb3Ioc01lc3NhZ2UpOworCQkJY21lLnByaW50U3RhY2tUcmFjZSgpOworCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2cobmV3IEpGcmFtZSgpLCBzTWVzc2FnZSwKKwkJCQkJIkNyZWRlbnRpYWwgTWFuYWdlciBFcnJvciIsIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOworCQkJcmV0dXJuOworCQl9CisgICAgICAgIAorICAgICAgICAvLyBTdGFydCBvYnNlcnZpbmcgY2hhbmdlcyB0byB0aGUgS2V5c3RvcmUKKyAgICAgICAgY3JlZE1hbmFnZXIuYWRkT2JzZXJ2ZXIodGhpcyk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIExvYWQgdGhlIFBhc3N3b3Jkc1RhYmxlTW9kZWwgd2l0aCB0aGUgcGFzc3dvcmQgZW50cmllcyBmcm9tIHRoZSBLZXlzdG9yZS4gCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9hZCgpIHRocm93cyBDTUV4Y2VwdGlvbgorICAgIHsKKyAgICAJdHJ5eworICAgICAgICAgICAgLy8gUGxhY2UgcGFzc3dvcmQgZW50cmllcycgYWxpYXNlcyBpbiBhIHRyZWUgbWFwIHRvIHNvcnQgdGhlbQorICAgICAgICAgICAgVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4gc29ydGVkQWxpYXNlcyA9IG5ldyBUcmVlTWFwPFN0cmluZywgU3RyaW5nPigpOyAgCisgICAgICAgICAgICAJCisgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBhbGlhc2VzID0gY3JlZE1hbmFnZXIuZ2V0QWxpYXNlcyhDcmVkZW50aWFsTWFuYWdlci5LRVlTVE9SRSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgCWZvciAoU3RyaW5nIGFsaWFzOiBhbGlhc2VzKXsKKyAgICAgICAgCQkvLyBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHVzZXJuYW1lL3Bhc3N3b3JkIGVudHJpZXMgaGVyZS4KKyAgICAgICAgCQkvLyBBbGlhcyBmb3Igc3VjaCBlbnRyaWVzIGlzIGNvbnN0cnVjdGVkIGFzICJwYXNzd29yZCMiPFNFUlZJQ0VfVVJMPiB3aGVyZQorICAgICAgICAJCS8vIHNlcnZpY2UgVVJMIGlzIHRoZSBzZXJ2aWNlIHRoaXMgdXNlcm5hbWUvcGFzc3dvcmQgcGFpciBpcyB0byBiZSB1c2VkIGZvci4KKyAgICAgICAgCQlpZiAoYWxpYXMuc3RhcnRzV2l0aCgicGFzc3dvcmQjIikpeworICAgICAgICAJCQlzb3J0ZWRBbGlhc2VzLnB1dChhbGlhcywgYWxpYXMpOworICAgICAgICAJCX0KKyAgICAgICAgCX0KKworICAgICAgICAgICAgLy8gQ3JlYXRlIG9uZSB0YWJsZSByb3cgZm9yIGVhY2ggcGFzc3dvcmQgZW50cnkKKyAgICAgICAgICAgIGRhdGEgPSBuZXcgT2JqZWN0W3NvcnRlZEFsaWFzZXMuc2l6ZSgpXVs2XTsKKworICAgICAgICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBzb3J0ZWQgYWxpYXNlcywgcmV0cmlldmluZyB0aGUgcGFzc3dvcmQKKyAgICAgICAgICAgIC8vIGVudHJpZXMgYW5kIHBvcHVsYXRpbmcgdGhlIHRhYmxlIG1vZGVsCisgICAgICAgICAgICBpbnQgaUNudCA9IDA7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBhbGlhcyA6IHNvcnRlZEFsaWFzZXMudmFsdWVzKCkpeworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIFBvcHVsYXRlIHRoZSB0eXBlIGNvbHVtbiAtIGl0IGlzIHNldCB3aXRoIGFuIGludGVnZXIKKyAgICAgICAgICAgICAgICAvLyBidXQgYSBjdXN0b20gY2VsbCByZW5kZXJlciB3aWxsIGNhdXNlIGEgc3VpdGFibGUgaWNvbgorICAgICAgICAgICAgICAgIC8vIHRvIGJlIGRpc3BsYXllZAorICAgICAgICAgICAgICAgIGRhdGFbaUNudF1bMF0gPSBDcmVkZW50aWFsTWFuYWdlclVJLlBBU1NXT1JEX0VOVFJZX1RZUEU7CisKKyAgICAgICAgICAgICAgICAvLyBQb3B1bGF0ZSB0aGUgc2VydmljZSBVUkwgY29sdW1uIGFzIGEgc3Vic3RyaW5nIG9mIGFsaWFzIAorICAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgJyMnIHRpbGwgdGhlIGVuZCBvZiB0aGUgc3RyaW5nCisgICAgICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VVUkwgPSBhbGlhcy5zdWJzdHJpbmcoYWxpYXMuaW5kZXhPZignIycpKzEpOworICAgICAgICAgICAgICAgIGRhdGFbaUNudF1bMV0gPSBzZXJ2aWNlVVJMOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIHBhaXIgZnJvbSB0aGUgS2V5c3RvcmUuIFRoZXkKKyAgICAgICAgICAgICAgICAvLyBhcmUgcmV0dXJuZWQgaW4gYSBzaW5nbGUgc3RyaW5nIGluIGZvcm1hdCA8VVNFUk5BTUU+IDxQQVNTV09SRD4KKyAgICAgICAgICAgICAgICBTdHJpbmcgdW5wYXNzUGFpciA9IGNyZWRNYW5hZ2VyLmdldFVzZXJuYW1lQW5kUGFzc3dvcmRGb3JTZXJ2aWNlKHNlcnZpY2VVUkwpOworICAgICAgICAgICAgCVN0cmluZyB1c2VybmFtZSA9IHVucGFzc1BhaXIuc3Vic3RyaW5nKDAsIHVucGFzc1BhaXIuaW5kZXhPZignICcpKTsKKyAgICAgICAgICAgIAlTdHJpbmcgcGFzc3dvcmQgPSB1bnBhc3NQYWlyLnN1YnN0cmluZyh1bnBhc3NQYWlyLmluZGV4T2YoJyAnKSsxKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBQb3B1bGF0ZSB0aGUgdXNlcm5hbWUgY29sdW1uCisgICAgICAgICAgICAgICAgZGF0YVtpQ250XVsyXSA9IHVzZXJuYW1lOworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gUG9wdWxhdGUgdGhlIGxhc3QgbW9kaWZpZWQgZGF0ZSBjb2x1bW4gKCJVQkVSIiBrZXlzdG9yZSB0eXBlIHN1cHBvcnRzIGNyZWF0aW9uIGRhdGUpCisgICAgICAgICAgICAgICAgZGF0YVtpQ250XVszXSA9IGNyZWRNYW5hZ2VyLmdldEVudHJ5Q3JlYXRpb25EYXRlKENyZWRlbnRpYWxNYW5hZ2VyLktFWVNUT1JFLCBhbGlhcyk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gUG9wdWxhdGUgdGhlIGludmlzaWJsZSBwYXNzd29yZCBjb2x1bW4KKyAgICAgICAgICAgICAgICBkYXRhW2lDbnRdWzRdID0gcGFzc3dvcmQ7IAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIFBvcHVsYXRlIHRoZSBpbnZpc2libGUgYWxpYXMgY29sdW1uCisgICAgICAgICAgICAgICAgZGF0YVtpQ250XVs1XSA9IGFsaWFzOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlDbnQrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmlyZVRhYmxlRGF0YUNoYW5nZWQoKTsKKyAgICAJfQorICAgIAljYXRjaCAoQ01FeGNlcHRpb24gY21lKXsKKwkJCXRocm93IGNtZTsKKyAgICAJfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSB0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldENvbHVtbkNvdW50KCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb2x1bW5OYW1lcy5sZW5ndGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgdGFibGUuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRSb3dDb3VudCgpCisgICAgeworICAgICAgICByZXR1cm4gZGF0YS5sZW5ndGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gYXQgdGhlIGdpdmVuIHBvc2l0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uTmFtZShpbnQgaUNvbCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb2x1bW5OYW1lc1tpQ29sXTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNlbGwgdmFsdWUgYXQgdGhlIGdpdmVuIHJvdyBhbmQgY29sdW1uIHBvc2l0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWVBdChpbnQgaVJvdywgaW50IGlDb2wpCisgICAgeworICAgICAgICByZXR1cm4gZGF0YVtpUm93XVtpQ29sXTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNsYXNzIGF0IG9mIHRoZSBjZWxscyBhdCB0aGUgZ2l2ZW4gY29sdW1uIHBvc2l0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzczw/IGV4dGVuZHMgT2JqZWN0PiBnZXRDb2x1bW5DbGFzcyhpbnQgaUNvbCkKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRWYWx1ZUF0KDAsIGlDb2wpLmdldENsYXNzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXMgdGhlIGNlbGwgYXQgdGhlIGdpdmVuIHJvdyBhbmQgY29sdW1uIHBvc2l0aW9uIGVkaXRhYmxlPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ2VsbEVkaXRhYmxlKGludCBpUm93LCBpbnQgaUNvbCkKKyAgICB7CisgICAgICAgIC8vIFRoZSB0YWJsZSBpcyBhbHdheXMgcmVhZC1vbmx5CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKwlwdWJsaWMgdm9pZCBub3RpZnkoT2JzZXJ2YWJsZTxLZXlzdG9yZUNoYW5nZWRFdmVudD4gc2VuZGVyLAorCQkJS2V5c3RvcmVDaGFuZ2VkRXZlbnQgbWVzc2FnZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCQorCQkvLyByZWxvYWQgdGhlIHRhYmxlCisJCWlmIChtZXNzYWdlLmtleXN0b3JlVHlwZS5lcXVhbHMoQ3JlZGVudGlhbE1hbmFnZXIuS0VZU1RPUkUpKXsKKwkJCWxvYWQoKTsKKwkJfQorCX0gICAgCisKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9uZXQvc2YvdGF2ZXJuYS90Mi93b3JrYmVuY2gvdWkvY3JlZGVudGlhbG1hbmFnZXIvUHJveGllc1RhYmxlTW9kZWwuamF2YSBiL3NyYy9tYWluL2phdmEvbmV0L3NmL3RhdmVybmEvdDIvd29ya2JlbmNoL3VpL2NyZWRlbnRpYWxtYW5hZ2VyL1Byb3hpZXNUYWJsZU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI4Yzk5OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvbmV0L3NmL3RhdmVybmEvdDIvd29ya2JlbmNoL3VpL2NyZWRlbnRpYWxtYW5hZ2VyL1Byb3hpZXNUYWJsZU1vZGVsLmphdmEKQEAgLTAsMCArMSwyMzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIFVuaXZlcnNpdHkgb2YgTWFuY2hlc3RlciAgIAorICogCisgKiAgTW9kaWZpY2F0aW9ucyB0byB0aGUgaW5pdGlhbCBjb2RlIGJhc2UgYXJlIGNvcHlyaWdodCBvZiB0aGVpcgorICogIHJlc3BlY3RpdmUgYXV0aG9ycywgb3IgdGhlaXIgZW1wbG95ZXJzIGFzIGFwcHJvcHJpYXRlLgorICogCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAgIAorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogICAgCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBuZXQuc2YudGF2ZXJuYS50Mi53b3JrYmVuY2gudWkuY3JlZGVudGlhbG1hbmFnZXI7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CisKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbDsKK2ltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7CitpbXBvcnQgamF2YXguc3dpbmcuSk9wdGlvblBhbmU7CitpbXBvcnQgamF2YXguc3dpbmcudGFibGUuQWJzdHJhY3RUYWJsZU1vZGVsOworCitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7CisKK2ltcG9ydCBuZXQuc2YudGF2ZXJuYS50Mi5sYW5nLm9ic2VydmVyLk9ic2VydmFibGU7CitpbXBvcnQgbmV0LnNmLnRhdmVybmEudDIubGFuZy5vYnNlcnZlci5PYnNlcnZlcjsKK2ltcG9ydCBuZXQuc2YudGF2ZXJuYS50Mi5zZWN1cml0eS5jcmVkZW50aWFsbWFuYWdlci5DTUV4Y2VwdGlvbjsKK2ltcG9ydCBuZXQuc2YudGF2ZXJuYS50Mi5zZWN1cml0eS5jcmVkZW50aWFsbWFuYWdlci5DTVg1MDlVdGlsOworaW1wb3J0IG5ldC5zZi50YXZlcm5hLnQyLnNlY3VyaXR5LmNyZWRlbnRpYWxtYW5hZ2VyLkNyZWRlbnRpYWxNYW5hZ2VyOworaW1wb3J0IG5ldC5zZi50YXZlcm5hLnQyLnNlY3VyaXR5LmNyZWRlbnRpYWxtYW5hZ2VyLktleXN0b3JlQ2hhbmdlZEV2ZW50OworCisvKioKKyAqIFRoZSB0YWJsZSBtb2RlbCB1c2VkIHRvIGRpc3BsYXkgdGhlIEtleXN0b3JlJ3MgcHJveHkga2V5IHBhaXIgZW50cmllcy4KKyAqIAorICogQGF1dGhvciBBbGV4IE5lbmFkaWMKKyAqLworQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCitwdWJsaWMgY2xhc3MgUHJveGllc1RhYmxlTW9kZWwgZXh0ZW5kcyBBYnN0cmFjdFRhYmxlTW9kZWwgaW1wbGVtZW50cyBPYnNlcnZlcjxLZXlzdG9yZUNoYW5nZWRFdmVudD4geworCisJLy8gQ29sdW1uIG5hbWVzIAorICAgIHByaXZhdGUgU3RyaW5nW10gY29sdW1uTmFtZXM7CisKKyAgICAvLyBUYWJsZSBkYXRhIAorICAgIHByaXZhdGUgT2JqZWN0W11bXSBkYXRhOworICAgIAorCXByaXZhdGUgQ3JlZGVudGlhbE1hbmFnZXIgY3JlZE1hbmFnZXI7CisgICAgCisJcHJpdmF0ZSBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihLZXlQYWlyc1RhYmxlTW9kZWwuY2xhc3MpOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IEtleVBhaXJzVGFibGVNb2RlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJveGllc1RhYmxlTW9kZWwoKQorICAgIHsKKyAgICAgICAgY3JlZE1hbmFnZXIgPSBudWxsOworICAgICAgICB0cnl7CisgICAgICAgIAljcmVkTWFuYWdlciA9IENyZWRlbnRpYWxNYW5hZ2VyLmdldEluc3RhbmNlKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKENNRXhjZXB0aW9uIGNtZSl7CisJCQkvLyBGYWlsZWQgdG8gaW5zdGFudGlhdGUgQ3JlZGVudGlhbCBNYW5hZ2VyIC0gd2FybiB0aGUgdXNlciBhbmQgZXhpdAorCQkJU3RyaW5nIHNNZXNzYWdlID0gIkZhaWxlZCB0byBpbnN0YW50aWF0ZSBDcmVkZW50aWFsIE1hbmFnZXIuICIgKyBjbWUuZ2V0TWVzc2FnZSgpOworCQkJbG9nZ2VyLmVycm9yKCJDTSBHVUk6ICIrIHNNZXNzYWdlKTsKKwkJCWNtZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKG5ldyBKRnJhbWUoKSwgc01lc3NhZ2UsCisJCQkJCSJDcmVkZW50aWFsIE1hbmFnZXIgRXJyb3IiLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKwkJCXJldHVybjsKKyAgICAgICAgfQorICAgIAkKKyAgICAgICAJZGF0YSA9IG5ldyBPYmplY3RbMF1bMF07CisgICAgICAgIGNvbHVtbk5hbWVzID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgIAkiRW50cnkgVHlwZSIsIC8vIHR5cGUgb2YgdGhlIEtleXN0b3JlIGVudHJ5CisgICAgICAgICAgICAJIk93bmVyIiwgLy8gb3duZXIncyBjb21tb24gbmFtZQorICAgICAgICAgICAgCSJJc3N1ZXIiLCAvLyBpc3N1ZXIncyBjb21tb24gbmFtZQorICAgICAgICAgICAgCSJTZXJpYWwgTnVtYmVyIiwgLy8gcHVibGljIGtleSBjZXJ0aWZpY2F0ZSdzIHNlcmlhbCBudW1iZXIKKyAgICAgICAgICAgIAkiTGFzdCBNb2RpZmllZCIsIC8vIGxhc3QgbW9kaWZpZWQgZGF0ZSBvZiB0aGUgZW50cnkKKyAgICAgICAgICAgICAgICAiQWxpYXMiLCAvLyB0aGUgaW52aXNpYmxlIGNvbHVtbiBob2xkaW5nIHRoZSBhY3R1YWwgYWxpYXMgaW4gdGhlIEtleXN0b3JlCisgICAgICAgIAl9OworICAgICAgICAKKyAgICAgICAgdHJ5IHsKKwkJCWxvYWQoKTsKKwkJfSBjYXRjaCAoQ01FeGNlcHRpb24gY21lKSB7CisJCQlTdHJpbmcgc01lc3NhZ2UgPSAiRmFpbGVkIHRvIGxvYWQgcHJveGllcyI7CisJCQlsb2dnZXIuZXJyb3Ioc01lc3NhZ2UpOworCQkJY21lLnByaW50U3RhY2tUcmFjZSgpOworCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2cobmV3IEpGcmFtZSgpLCBzTWVzc2FnZSwKKwkJCQkJIkNyZWRlbnRpYWwgTWFuYWdlciBFcnJvciIsIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOworCQkJcmV0dXJuOworCQl9CisJCQorICAgICAgICAvLyBTdGFydCBvYnNlcnZpbmcgY2hhbmdlcyB0byB0aGUgS2V5c3RvcmUKKyAgICAgICAgY3JlZE1hbmFnZXIuYWRkT2JzZXJ2ZXIodGhpcyk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIExvYWQgdGhlIFByb3hpZXNUYWJsZU1vZGVsIHdpdGggdGhlIHByb3h5IGVudHJpZXMgZnJvbSB0aGUgS2V5c3RvcmUuIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvYWQoKSB0aHJvd3MgQ01FeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgdHJ5eworICAgICAgICAgICAgLy8gUGxhY2UgcHJveHkgZW50cmllcycgYWxpYXNlcyBpbiBhIHRyZWUgbWFwIHRvIHNvcnQgdGhlbQorICAgICAgICAgICAgVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4gc29ydGVkQWxpYXNlcyA9IG5ldyBUcmVlTWFwPFN0cmluZywgU3RyaW5nPigpOyAgCisgICAgICAgICAgICAJCisgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBhbGlhc2VzID0gY3JlZE1hbmFnZXIuZ2V0QWxpYXNlcyhDcmVkZW50aWFsTWFuYWdlci5LRVlTVE9SRSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgCWZvciAoU3RyaW5nIGFsaWFzOiBhbGlhc2VzKXsKKyAgICAgICAgCQkvLyBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHByb3h5IGVudHJpZXMgaGVyZS4KKyAgICAgICAgCQkvLyBBbGlhcyBmb3Igc3VjaCBlbnRyaWVzIGlzIGNvbnN0cnVjdGVkIGFzICJwcm94eSM8Q0VSVF9TRVJJQUxfTlVNQkVSPiM8Q0VSVF9DT01NT05fTkFNRT4iIHdoZXJlCisgICAgICAgIAkJaWYgKGFsaWFzLnN0YXJ0c1dpdGgoImNhZ3JpZHByb3h5IyIpIHx8IGFsaWFzLnN0YXJ0c1dpdGgoInByb3h5IyIpKXsgLy8gZm9yIGRpZmZlcmVudCBwcm94aWVzCisgICAgICAgIAkJCXNvcnRlZEFsaWFzZXMucHV0KGFsaWFzLCBhbGlhcyk7CisgICAgICAgIAkJfQorICAgICAgICAJfSAgICAJCQorICAgICAgICAJCQkKKyAgICAgICAgICAgIC8vIENyZWF0ZSBvbmUgdGFibGUgcm93IGZvciBlYWNoIHByb3h5IGVudHJ5CisgICAgICAgICAgICBkYXRhID0gbmV3IE9iamVjdFtzb3J0ZWRBbGlhc2VzLnNpemUoKV1bNl07CisKKyAgICAgICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgc29ydGVkIGFsaWFzZXMgKGlmIGFueSksIHJldHJpZXZpbmcgdGhlIHByb3h5CisgICAgICAgICAgICAvLyBlbnRyaWVzIGFuZCBwb3B1bGF0aW5nIHRoZSB0YWJsZSBtb2RlbAorICAgICAgICAgICAgaW50IGlDbnQgPSAwOworICAgICAgICAgICAgZm9yIChTdHJpbmcgYWxpYXMgOiBzb3J0ZWRBbGlhc2VzLnZhbHVlcygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCWlmIChhbGlhcy5zdGFydHNXaXRoKCJjYWdyaWRwcm94eSMiKSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8vIFBvcHVsYXRlIHRoZSB0eXBlIGNvbHVtbiAtIGl0IGlzIHNldCB3aXRoIGFuIGludGVnZXIKKyAgICAgICAgICAgICAgICAgICAgLy8gYnV0IGEgY3VzdG9tIGNlbGwgcmVuZGVyZXIgd2lsbCBjYXVzZSBhIHN1aXRhYmxlIGljb24KKyAgICAgICAgICAgICAgICAgICAgLy8gdG8gYmUgZGlzcGxheWVkCisgICAgICAgICAgICAgICAgICAgIGRhdGFbaUNudF1bMF0gPSBDcmVkZW50aWFsTWFuYWdlclVJLlBST1hZX0VOVFJZX1RZUEU7CisKKyAgICAgICAgICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnQgPSBDTVg1MDlVdGlsLmNvbnZlcnRDZXJ0aWZpY2F0ZShjcmVkTWFuYWdlci5nZXRDZXJ0aWZpY2F0ZShDcmVkZW50aWFsTWFuYWdlci5LRVlTVE9SRSwgYWxpYXMpKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBQb3B1bGF0ZSB0aGUgIk93bmVyOlNlcmlhbCBOdW1iZXIiIGNvbHVtbiBleHRyYWN0ZWQgZnJvbSB0aGUgYWxpYXMKKyAgICAgICAgCQkJU3RyaW5nIG93bmVyRE4gPSBjZXJ0LmdldFN1YmplY3RYNTAwUHJpbmNpcGFsKCkuZ2V0TmFtZShYNTAwUHJpbmNpcGFsLlJGQzIyNTMpOworICAgICAgICAJCQlDTVg1MDlVdGlsIHV0aWwgPSBuZXcgQ01YNTA5VXRpbCgpOworICAgICAgICAJCQl1dGlsLnBhcnNlRE4ob3duZXJETik7CisgICAgICAgICAgICAgICAgICAgIGRhdGFbaUNudF1bMV0gPSB1dGlsLmdldENOKCk7IC8vIG93bmVyJ3MgY29tbW9uIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8vIFBvcHVsYXRlIHRoZSBpc3N1ZXIgY29sdW1uCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpc3N1ZXJETiA9IGNlcnQuZ2V0SXNzdWVyWDUwMFByaW5jaXBhbCgpLmdldE5hbWUoWDUwMFByaW5jaXBhbC5SRkMyMjUzKTsKKyAgICAgICAgICAgICAgICAgICAgdXRpbC5wYXJzZUROKGlzc3VlckROKTsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVtpQ250XVsyXSA9IHV0aWwuZ2V0Q04oKTsKKyAgICAgICAgCQkJCisgICAgICAgIAkJCS8vIEdldCB0aGUgaGV4YWRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNlcnRpZmljYXRlJ3Mgc2VyaWFsIG51bWJlcgorICAgICAgICAJCQlTdHJpbmcgc2VyaWFsTnVtYmVyID0gbmV3IEJpZ0ludGVnZXIoMSwgY2VydC5nZXRTZXJpYWxOdW1iZXIoKS50b0J5dGVBcnJheSgpKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVtpQ250XVszXSA9IHNlcmlhbE51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8vIFBvcHVsYXRlIHRoZSBtb2RpZmllZCBkYXRlIGNvbHVtbiAoIlVCRVIiIGtleXN0b3JlIHR5cGUgc3VwcG9ydHMgY3JlYXRpb24gZGF0ZSkKKyAgICAgICAgICAgICAgICAgICAJZGF0YVtpQ250XVs0XSA9IGNyZWRNYW5hZ2VyLmdldEVudHJ5Q3JlYXRpb25EYXRlKENyZWRlbnRpYWxNYW5hZ2VyLktFWVNUT1JFLCBhbGlhcyk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvLyBQb3B1bGF0ZSB0aGUgaW52aXNpYmxlIGFsaWFzIGNvbHVtbgorICAgICAgICAgICAgICAgICAgICBkYXRhW2lDbnRdWzVdID0gYWxpYXM7IAorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaUNudCsrOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkvLyBlbHNlIGlmIChhbGlhcy5zdGFydHNXaXRoKCJwcm94eSMiKSkge30gLy8gZm9yIHNvbWUgb3RoZXIgcHJveGllcworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChDTUV4Y2VwdGlvbiBjbWUpeworICAgICAgICAgICAgdGhyb3cgKGNtZSk7CisgICAgICAgIH0KKworICAgICAgICBmaXJlVGFibGVEYXRhQ2hhbmdlZCgpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSB0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldENvbHVtbkNvdW50KCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb2x1bW5OYW1lcy5sZW5ndGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgdGFibGUuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRSb3dDb3VudCgpCisgICAgeworICAgICAgICByZXR1cm4gZGF0YS5sZW5ndGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gYXQgdGhlIGdpdmVuIHBvc2l0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uTmFtZShpbnQgaUNvbCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb2x1bW5OYW1lc1tpQ29sXTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNlbGwgdmFsdWUgYXQgdGhlIGdpdmVuIHJvdyBhbmQgY29sdW1uIHBvc2l0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWVBdChpbnQgaVJvdywgaW50IGlDb2wpCisgICAgeworICAgICAgICByZXR1cm4gZGF0YVtpUm93XVtpQ29sXTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNsYXNzIGF0IG9mIHRoZSBjZWxscyBhdCB0aGUgZ2l2ZW4gY29sdW1uIHBvc2l0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzczw/IGV4dGVuZHMgT2JqZWN0PiBnZXRDb2x1bW5DbGFzcyhpbnQgaUNvbCkKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRWYWx1ZUF0KDAsIGlDb2wpLmdldENsYXNzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXMgdGhlIGNlbGwgYXQgdGhlIGdpdmVuIHJvdyBhbmQgY29sdW1uIHBvc2l0aW9uIGVkaXRhYmxlPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ2VsbEVkaXRhYmxlKGludCBpUm93LCBpbnQgaUNvbCkKKyAgICB7CisgICAgICAgIC8vIFRoZSB0YWJsZSBpcyBhbHdheXMgcmVhZC1vbmx5CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKwlwdWJsaWMgdm9pZCBub3RpZnkoT2JzZXJ2YWJsZTxLZXlzdG9yZUNoYW5nZWRFdmVudD4gc2VuZGVyLAorCQkJS2V5c3RvcmVDaGFuZ2VkRXZlbnQgbWVzc2FnZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJLy8gcmVsb2FkIHRoZSB0YWJsZQorCQlpZiAobWVzc2FnZS5rZXlzdG9yZVR5cGUuZXF1YWxzKENyZWRlbnRpYWxNYW5hZ2VyLktFWVNUT1JFKSl7CisJCQlsb2FkKCk7CisJCX0KKwl9ICAgIAorCit9CisKKwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9uZXQvc2YvdGF2ZXJuYS90Mi93b3JrYmVuY2gvdWkvY3JlZGVudGlhbG1hbmFnZXIvVGFibGVDZWxsUmVuZGVyZXIuamF2YSBiL3NyYy9tYWluL2phdmEvbmV0L3NmL3RhdmVybmEvdDIvd29ya2JlbmNoL3VpL2NyZWRlbnRpYWxtYW5hZ2VyL1RhYmxlQ2VsbFJlbmRlcmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRiNzg4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvbmV0L3NmL3RhdmVybmEvdDIvd29ya2JlbmNoL3VpL2NyZWRlbnRpYWxtYW5hZ2VyL1RhYmxlQ2VsbFJlbmRlcmVyLmphdmEKQEAgLTAsMCArMSwxMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIFVuaXZlcnNpdHkgb2YgTWFuY2hlc3RlciAgIAorICogCisgKiAgTW9kaWZpY2F0aW9ucyB0byB0aGUgaW5pdGlhbCBjb2RlIGJhc2UgYXJlIGNvcHlyaWdodCBvZiB0aGVpcgorICogIHJlc3BlY3RpdmUgYXV0aG9ycywgb3IgdGhlaXIgZW1wbG95ZXJzIGFzIGFwcHJvcHJpYXRlLgorICogCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAgIAorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogICAgCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBuZXQuc2YudGF2ZXJuYS50Mi53b3JrYmVuY2gudWkuY3JlZGVudGlhbG1hbmFnZXI7CisKK2ltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7CitpbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBqYXZheC5zd2luZy5JbWFnZUljb247CitpbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOworaW1wb3J0IGphdmF4LnN3aW5nLkpUYWJsZTsKK2ltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuRW1wdHlCb3JkZXI7CitpbXBvcnQgamF2YXguc3dpbmcudGFibGUuRGVmYXVsdFRhYmxlQ2VsbFJlbmRlcmVyOworCitpbXBvcnQgbmV0LnNmLnRhdmVybmEudDIud29ya2JlbmNoLnVpLmNyZWRlbnRpYWxtYW5hZ2VyLkNyZWRlbnRpYWxNYW5hZ2VyVUk7CitpbXBvcnQgbmV0LnNmLnRhdmVybmEudDIud29ya2JlbmNoLnVpLmNyZWRlbnRpYWxtYW5hZ2VyLktleVBhaXJzVGFibGVNb2RlbDsKK2ltcG9ydCBuZXQuc2YudGF2ZXJuYS50Mi53b3JrYmVuY2gudWkuY3JlZGVudGlhbG1hbmFnZXIuUGFzc3dvcmRzVGFibGVNb2RlbDsKK2ltcG9ydCBuZXQuc2YudGF2ZXJuYS50Mi53b3JrYmVuY2gudWkuY3JlZGVudGlhbG1hbmFnZXIuVGFibGVDZWxsUmVuZGVyZXI7CitpbXBvcnQgbmV0LnNmLnRhdmVybmEudDIud29ya2JlbmNoLnVpLmNyZWRlbnRpYWxtYW5hZ2VyLlRydXN0ZWRDZXJ0c1RhYmxlTW9kZWw7CisKKy8qKgorICogQ3VzdG9tIGNlbGwgcmVuZGVyZXIgZm9yIHRoZSBjZWxscyBvZiB0aGUgdGFibGVzIGRpc3BsYXlpbmcgS2V5c3RvcmUvVHJ1c3RzdG9yZSBjb250ZW50cy4KKyAqIAorICogQGF1dGhvciBBbGV4YW5kcmEgTmVuYWRpYworICovCitwdWJsaWMgY2xhc3MgVGFibGVDZWxsUmVuZGVyZXIKKyAgICBleHRlbmRzIERlZmF1bHRUYWJsZUNlbGxSZW5kZXJlcgoreworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zOTgzOTg2NjgyNzk0MDEwMjU5TDsKKworCXByaXZhdGUgZmluYWwgSW1hZ2VJY29uIHBhc3N3b3JkRW50cnlJY29uID0gbmV3IEltYWdlSWNvbihUYWJsZUNlbGxSZW5kZXJlci5jbGFzcy5nZXRSZXNvdXJjZSgKKwkiL2ltYWdlcy90YWJsZS9rZXlfZW50cnkucG5nIikpOworCQorCXByaXZhdGUgZmluYWwgSW1hZ2VJY29uIGtleXBhaXJFbnRyeUljb24gPSBuZXcgSW1hZ2VJY29uKFRhYmxlQ2VsbFJlbmRlcmVyLmNsYXNzLmdldFJlc291cmNlKAorCSIvaW1hZ2VzL3RhYmxlL2tleXBhaXJfZW50cnkucG5nIikpOworCQorCXByaXZhdGUgZmluYWwgSW1hZ2VJY29uIHRydXN0Y2VydEVudHJ5SWNvbiA9IG5ldyBJbWFnZUljb24oVGFibGVDZWxsUmVuZGVyZXIuY2xhc3MuZ2V0UmVzb3VyY2UoCisJIi9pbWFnZXMvdGFibGUvdHJ1c3RjZXJ0X2VudHJ5LnBuZyIpKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHJlbmRlcmVkIGNlbGwgZm9yIHRoZSBzdXBwbGllZCB2YWx1ZSBhbmQgY29sdW1uLgorICAgICAqCisgICAgICogQHBhcmFtIGp0S2V5U3RvcmUgVGhlIEpUYWJsZQorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduIHRvIHRoZSBjZWxsCisgICAgICogQHBhcmFtIGJJc1NlbGVjdGVkIFRydWUgaWYgY2VsbCBpcyBzZWxlY3RlZAorICAgICAqIEBwYXJhbSBpUm93IFRoZSByb3cgb2YgdGhlIGNlbGwgdG8gcmVuZGVyCisgICAgICogQHBhcmFtIGlDb2wgVGhlIGNvbHVtbiBvZiB0aGUgY2VsbCB0byByZW5kZXIKKyAgICAgKiBAcGFyYW0gYkhhc0ZvY3VzIElmIHRydWUsIHJlbmRlciBjZWxsIGFwcHJvcHJpYXRlbHkKKyAgICAgKiBAcmV0dXJuIFRoZSByZW5kZXJlcmVkIGNlbGwKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29tcG9uZW50IGdldFRhYmxlQ2VsbFJlbmRlcmVyQ29tcG9uZW50KEpUYWJsZSBqdEtleVN0b3JlVGFibGUsCisgICAgICAgIE9iamVjdCB2YWx1ZSwgYm9vbGVhbiBiSXNTZWxlY3RlZCwgYm9vbGVhbiBiSGFzRm9jdXMsIGludCBpUm93LAorICAgICAgICBpbnQgaUNvbCkKKyAgICB7CisgICAgICAgIEpMYWJlbCBjZWxsID0gKEpMYWJlbCkgc3VwZXIuZ2V0VGFibGVDZWxsUmVuZGVyZXJDb21wb25lbnQoanRLZXlTdG9yZVRhYmxlLAorICAgICAgICAgICAgdmFsdWUsIGJJc1NlbGVjdGVkLCBiSGFzRm9jdXMsIGlSb3csIGlDb2wpOworCisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKXsKKyAgICAgICAgICAgIC8vIFR5cGUgY29sdW1uIC0gZGlzcGxheSBhbiBpY29uIHJlcHJlc2VudGluZyB0aGUgdHlwZQorICAgICAgICAgICAgaWYgKGlDb2wgPT0gMCkgeworICAgICAgICAgICAgICAgIEltYWdlSWNvbiBpY29uID0gbnVsbDsKKyAgICAgICAgICAgICAgICAvL1RoZSBjZWxsIGlzIGluIHRoZSBmaXJzdCBjb2x1bW4gb2YgUGFzc3dvcmRzIHRhYmxlCisgICAgICAgICAgICAgICAgaWYgKENyZWRlbnRpYWxNYW5hZ2VyVUkuUEFTU1dPUkRfRU5UUllfVFlQRS5lcXVhbHModmFsdWUpKSB7IAorICAgICAgICAgICAgICAgICAgICBpY29uID0gcGFzc3dvcmRFbnRyeUljb247IC8va2V5IChpLmUuIHBhc3N3b3JkKSBlbnRyeSBpbWFnZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBUaGUgY2VsbCBpcyBpbiB0aGUgZmlyc3QgY29sdW1uIG9mIEtleSBQYWlycyB0YWJsZQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKENyZWRlbnRpYWxNYW5hZ2VyVUkuS0VZX1BBSVJfRU5UUllfVFlQRS5lcXVhbHModmFsdWUpKSB7IAorICAgICAgICAgICAgICAgICAgICBpY29uID0ga2V5cGFpckVudHJ5SWNvbjsgLy9rZXkgcGFpciBlbnRyeSBpbWFnZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBUaGUgY2VsbCBpcyBpbiB0aGUgZmlyc3QgY29sdW1uIG9mIFByb3hpZXMgdGFibGUKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChDcmVkZW50aWFsTWFuYWdlclVJLlBST1hZX0VOVFJZX1RZUEUuZXF1YWxzKHZhbHVlKSkgeyAKKyAgICAgICAgICAgICAgICAgICAgaWNvbiA9IGtleXBhaXJFbnRyeUljb247IC8va2V5IHBhaXIgZW50cnkgaW1hZ2UKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy9UaGUgY2VsbCBpcyBpbiB0aGUgZmlyc3QgY29sdW1uIG9mIFRydXN0ZWQgQ2VydGlmaWNhdGVzIHRhYmxlCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoQ3JlZGVudGlhbE1hbmFnZXJVSS5UUlVTVF9DRVJUX0VOVFJZX1RZUEUuZXF1YWxzKHZhbHVlKSkgeyAKKyAgICAgICAgICAgICAgICAgICAgaWNvbiA9IHRydXN0Y2VydEVudHJ5SWNvbjsgLy90cnVzdC4gY2VydGlmaWNhdGUgZW50cnkgaW1hZ2UKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjZWxsLnNldEljb24oaWNvbik7CisgICAgICAgICAgICAgICAgY2VsbC5zZXRUZXh0KCIiKTsKKyAgICAgICAgICAgICAgICBjZWxsLnNldFZlcnRpY2FsQWxpZ25tZW50KENFTlRFUik7CisgICAgICAgICAgICAgICAgY2VsbC5zZXRIb3Jpem9udGFsQWxpZ25tZW50KENFTlRFUik7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBMYXN0IE1vZGlmaWVkIGNvbHVtbiAtIGZvcm1hdCBkYXRlIChpZiBkYXRlIHN1cHBsaWVkKSAgICAgICAgCisgICAgICAgICAgICBlbHNlIGlmICgoKGp0S2V5U3RvcmVUYWJsZS5nZXRNb2RlbCgpIGluc3RhbmNlb2YgUGFzc3dvcmRzVGFibGVNb2RlbCkgJiYgKGlDb2wgPT0gMykpIHx8IAorICAgICAgICAgICAgCSgoanRLZXlTdG9yZVRhYmxlLmdldE1vZGVsKCkgaW5zdGFuY2VvZiBLZXlQYWlyc1RhYmxlTW9kZWwpICYmIChpQ29sID09IDQpKXx8CisgICAgICAgICAgICAJKChqdEtleVN0b3JlVGFibGUuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFByb3hpZXNUYWJsZU1vZGVsKSAmJiAoaUNvbCA9PSA0KSl8fAorICAgICAgICAgICAgCSgoanRLZXlTdG9yZVRhYmxlLmdldE1vZGVsKCkgaW5zdGFuY2VvZiBUcnVzdGVkQ2VydHNUYWJsZU1vZGVsKSAmJiAoaUNvbCA9PSA0KSkpeworICAgICAgICAgICAgCWlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHsKKyAgICAgICAgICAgIAkJLy8gSW5jbHVkZSB0aW1lem9uZQorICAgICAgICAgICAgCQljZWxsLnNldFRleHQoRGF0ZUZvcm1hdC5nZXREYXRlVGltZUluc3RhbmNlKERhdGVGb3JtYXQuTUVESVVNLAorICAgICAgICAgICAgCQkJRGF0ZUZvcm1hdC5MT05HKS5mb3JtYXQoKERhdGUpIHZhbHVlKSk7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgCWVsc2UgeworICAgICAgICAgICAgCQljZWxsLnNldFRleHQodmFsdWUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gT3RoZXIgY29sdW1ucyAtIGp1c3QgdXNlIHRoZWlyIHRleHQKKyAgICAgICAgICAgIGVsc2UgeyAKKyAgICAgICAgICAgIAljZWxsLnNldFRleHQodmFsdWUudG9TdHJpbmcoKSk7ICAgICAJCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjZWxsLnNldEJvcmRlcihuZXcgRW1wdHlCb3JkZXIoMCwgNSwgMCwgNSkpOworCisgICAgICAgIHJldHVybiBjZWxsOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9uZXQvc2YvdGF2ZXJuYS90Mi93b3JrYmVuY2gvdWkvY3JlZGVudGlhbG1hbmFnZXIvVGFibGVIZWFkZXJSZW5kZXJlci5qYXZhIGIvc3JjL21haW4vamF2YS9uZXQvc2YvdGF2ZXJuYS90Mi93b3JrYmVuY2gvdWkvY3JlZGVudGlhbG1hbmFnZXIvVGFibGVIZWFkZXJSZW5kZXJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYzZjYjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL25ldC9zZi90YXZlcm5hL3QyL3dvcmtiZW5jaC91aS9jcmVkZW50aWFsbWFuYWdlci9UYWJsZUhlYWRlclJlbmRlcmVyLmphdmEKQEAgLTAsMCArMSwxNDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIFVuaXZlcnNpdHkgb2YgTWFuY2hlc3RlciAgIAorICogCisgKiAgTW9kaWZpY2F0aW9ucyB0byB0aGUgaW5pdGlhbCBjb2RlIGJhc2UgYXJlIGNvcHlyaWdodCBvZiB0aGVpcgorICogIHJlc3BlY3RpdmUgYXV0aG9ycywgb3IgdGhlaXIgZW1wbG95ZXJzIGFzIGFwcHJvcHJpYXRlLgorICogCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAgIAorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogICAgCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBuZXQuc2YudGF2ZXJuYS50Mi53b3JrYmVuY2gudWkuY3JlZGVudGlhbG1hbmFnZXI7CisKK2ltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7CitpbXBvcnQgamF2YXguc3dpbmcuSW1hZ2VJY29uOworaW1wb3J0IGphdmF4LnN3aW5nLkpMYWJlbDsKK2ltcG9ydCBqYXZheC5zd2luZy5KVGFibGU7CitpbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkJldmVsQm9yZGVyOworaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5Db21wb3VuZEJvcmRlcjsKK2ltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuRW1wdHlCb3JkZXI7CitpbXBvcnQgamF2YXguc3dpbmcudGFibGUuRGVmYXVsdFRhYmxlQ2VsbFJlbmRlcmVyOworCitpbXBvcnQgbmV0LnNmLnRhdmVybmEudDIud29ya2JlbmNoLnVpLmNyZWRlbnRpYWxtYW5hZ2VyLktleVBhaXJzVGFibGVNb2RlbDsKK2ltcG9ydCBuZXQuc2YudGF2ZXJuYS50Mi53b3JrYmVuY2gudWkuY3JlZGVudGlhbG1hbmFnZXIuUGFzc3dvcmRzVGFibGVNb2RlbDsKK2ltcG9ydCBuZXQuc2YudGF2ZXJuYS50Mi53b3JrYmVuY2gudWkuY3JlZGVudGlhbG1hbmFnZXIuVGFibGVIZWFkZXJSZW5kZXJlcjsKK2ltcG9ydCBuZXQuc2YudGF2ZXJuYS50Mi53b3JrYmVuY2gudWkuY3JlZGVudGlhbG1hbmFnZXIuVHJ1c3RlZENlcnRzVGFibGVNb2RlbDsKKworLyoqCisgKiBDdXN0b20gY2VsbCByZW5kZXJlciBmb3IgdGhlIGhlYWRlcnMgb2YgdGhlIHRhYmxlcyBkaXNwbGF5aW5nIEtleXN0b3JlL1RydXN0c3RvcmUgY29udGVudHMuCisgKiAKKyAqIEBhdXRob3IgQWxleGFuZHJhIE5lbmFkaWMKKyAqLworQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCitwdWJsaWMgY2xhc3MgVGFibGVIZWFkZXJSZW5kZXJlciBleHRlbmRzIERlZmF1bHRUYWJsZUNlbGxSZW5kZXJlciB7CisJCisJcHJpdmF0ZSBmaW5hbCBJbWFnZUljb24gZW50cnlUeXBlSWNvbiA9IG5ldyBJbWFnZUljb24oVGFibGVIZWFkZXJSZW5kZXJlci5jbGFzcy5nZXRSZXNvdXJjZSgKKwkiL2ltYWdlcy90YWJsZS9lbnRyeV9oZWFkaW5nLnBuZyIpKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSByZW5kZXJlZCBoZWFkZXIgY2VsbCBmb3IgdGhlIHN1cHBsaWVkIHZhbHVlIGFuZCBjb2x1bW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0ganRLZXlTdG9yZSBUaGUgSlRhYmxlCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24gdG8gdGhlIGNlbGwKKyAgICAgKiBAcGFyYW0gYklzU2VsZWN0ZWQgVHJ1ZSBpZiBjZWxsIGlzIHNlbGVjdGVkCisgICAgICogQHBhcmFtIGlSb3cgVGhlIHJvdyBvZiB0aGUgY2VsbCB0byByZW5kZXIKKyAgICAgKiBAcGFyYW0gaUNvbCBUaGUgY29sdW1uIG9mIHRoZSBjZWxsIHRvIHJlbmRlcgorICAgICAqIEBwYXJhbSBiSGFzRm9jdXMgSWYgdHJ1ZSwgcmVuZGVyIGNlbGwgYXBwcm9wcmlhdGVseQorICAgICAqKiBAcmV0dXJuIFRoZSByZW5kZXJlcmVkIGNlbGwKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29tcG9uZW50IGdldFRhYmxlQ2VsbFJlbmRlcmVyQ29tcG9uZW50KEpUYWJsZSBqdEtleVN0b3JlVGFibGUsCisgICAgICAgIE9iamVjdCB2YWx1ZSwgYm9vbGVhbiBiSXNTZWxlY3RlZCwgYm9vbGVhbiBiSGFzRm9jdXMsIGludCBpUm93LAorICAgICAgICBpbnQgaUNvbCkKKyAgICB7CisgICAgICAgIC8vIEdldCBoZWFkZXIgcmVuZGVyZXIKKyAgICAgICAgSkxhYmVsIGhlYWRlciA9IChKTGFiZWwpIGp0S2V5U3RvcmVUYWJsZS5nZXRDb2x1bW5Nb2RlbCgpLmdldENvbHVtbihpQ29sKS5nZXRIZWFkZXJSZW5kZXJlcigpOworCisgICAgICAgIC8vIFRoZSBlbnRyeSB0eXBlIGhlYWRlciBjb250YWlucyBhbiBpY29uCisgICAgICAgIGlmIChpQ29sID09IDApIHsKKyAgICAgICAgICAgIGhlYWRlci5zZXRUZXh0KCIiKTsKKyAgICAgICAgICAgIGhlYWRlci5zZXRJY29uKGVudHJ5VHlwZUljb24pOyAvLyBlbnRyeSB0eXBlIGljb24gKGhlYWRlciBmb3IgdGhlIGZpcnN0IGNvbHVtbiBvZiB0aGUgdGFibGUpCisgICAgICAgICAgICBoZWFkZXIuc2V0SG9yaXpvbnRhbEFsaWdubWVudChDRU5URVIpOworICAgICAgICAgICAgaGVhZGVyLnNldFZlcnRpY2FsQWxpZ25tZW50KENFTlRFUik7CisgICAgICAgICAgICBoZWFkZXIuc2V0VG9vbFRpcFRleHQoIkVudHJ5IHR5cGUiKTsKKworICAgICAgICB9CisgICAgICAgIC8vIEFsbCBvdGhlciBoZWFkZXJzIGNvbnRhaW4gdGV4dAorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGhlYWRlci5zZXRUZXh0KChTdHJpbmcpIHZhbHVlKTsKKyAgICAgICAgICAgIGhlYWRlci5zZXRIb3Jpem9udGFsQWxpZ25tZW50KExFRlQpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBQYXNzd29yZHMgdGFibGUgaGFzIDUgY29sdW1zLCBLZXkgcGFpcnMgYW5kIFRydXN0ZWQgQ2VydGlmaWNhdGVzIHRhYmxlcyBoYXZlIDMgZWFjaAorICAgICAgICAgICAgaWYgKGp0S2V5U3RvcmVUYWJsZS5nZXRNb2RlbCgpIGluc3RhbmNlb2YgUGFzc3dvcmRzVGFibGVNb2RlbCl7CisgICAgICAgICAgICAgICAgaWYgKGlDb2wgPT0gMSkgeyAvL1NlcnZpY2UgVVJMIGNvbHVtbgorICAgICAgICAgICAgICAgICAgICBoZWFkZXIuc2V0VG9vbFRpcFRleHQoIlVSTCBvZiB0aGUgc2VydmljZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgd2lsbCBiZSB1c2VkIGZvciIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChpQ29sID09IDIpeyAvL1VzZXJuYW1lIGNvbHVtbiAKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyLnNldFRvb2xUaXBUZXh0KCJVc2VybmFtZSBmb3IgdGhlIHNlcnZpY2UiKTsgICAgICAgICAgICAgICAgCQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChpQ29sID09IDMpeyAvLyBMYXN0IG1vZGlmaWVkIGNvbHVtbgorICAgICAgICAgICAgICAgICAgICBoZWFkZXIuc2V0VG9vbFRpcFRleHQoIkxhc3QgbW9kaWZpY2F0aW9uIGRhdGUgYW5kIHRpbWUiKTsKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgCQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihqdEtleVN0b3JlVGFibGUuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIEtleVBhaXJzVGFibGVNb2RlbCl7CisgICAgICAgICAgICAgICAgaWYgKGlDb2wgPT0gMSkgeyAvL093bmVyCisgICAgICAgICAgICAgICAgICAgIGhlYWRlci5zZXRUb29sVGlwVGV4dCgiQ2VydGlmaWNhdGUncyBvd25lciIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChpQ29sID09IDIpIHsgLy9Jc3N1ZXIKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyLnNldFRvb2xUaXBUZXh0KCJDZXJ0aWZpY2F0ZSdzIGlzc3VlciIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChpQ29sID09IDMpeyAvL1NlcmlhbCBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyLnNldFRvb2xUaXBUZXh0KCJDZXJ0aWZpY2F0ZSdzIHNlcmlhbCBudW1iZXIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZihpQ29sID09IDQpIHsgLy8gTGFzdCBtb2RpZmllZCBjb2x1bW4KKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyLnNldFRvb2xUaXBUZXh0KCJMYXN0IG1vZGlmaWNhdGlvbiBkYXRlIGFuZCB0aW1lIik7CisgICAgICAgICAgICAgICAgfSAgICAgICAgIAkKKyAgICAgICAgICAgIH0gICAgICAgCisgICAgICAgICAgICBlbHNlIGlmKGp0S2V5U3RvcmVUYWJsZS5nZXRNb2RlbCgpIGluc3RhbmNlb2YgUHJveGllc1RhYmxlTW9kZWwpeworICAgICAgICAgICAgICAgIGlmIChpQ29sID09IDEpIHsgLy9Pd25lcgorICAgICAgICAgICAgICAgICAgICBoZWFkZXIuc2V0VG9vbFRpcFRleHQoIkNlcnRpZmljYXRlJ3Mgb3duZXIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoaUNvbCA9PSAyKSB7IC8vSXNzdWVyCisgICAgICAgICAgICAgICAgICAgIGhlYWRlci5zZXRUb29sVGlwVGV4dCgiQ2VydGlmaWNhdGUncyBpc3N1ZXIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoaUNvbCA9PSAzKXsgLy9TZXJpYWwgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgIGhlYWRlci5zZXRUb29sVGlwVGV4dCgiQ2VydGlmaWNhdGUncyBzZXJpYWwgbnVtYmVyIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoaUNvbCA9PSA0KSB7IC8vIExhc3QgbW9kaWZpZWQgY29sdW1uCisgICAgICAgICAgICAgICAgICAgIGhlYWRlci5zZXRUb29sVGlwVGV4dCgiTGFzdCBtb2RpZmljYXRpb24gZGF0ZSBhbmQgdGltZSIpOworICAgICAgICAgICAgICAgIH0gICAgICAgCQorICAgICAgICAgICAgfSAKKyAgICAgICAgICAgIGVsc2UgaWYoanRLZXlTdG9yZVRhYmxlLmdldE1vZGVsKCkgaW5zdGFuY2VvZiBUcnVzdGVkQ2VydHNUYWJsZU1vZGVsKXsKKyAgICAgICAgICAgICAgICBpZiAoaUNvbCA9PSAxKSB7IC8vT3duZXIKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyLnNldFRvb2xUaXBUZXh0KCJDZXJ0aWZpY2F0ZSdzIG93bmVyIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlDb2wgPT0gMikgeyAvL0lzc3VlcgorICAgICAgICAgICAgICAgICAgICBoZWFkZXIuc2V0VG9vbFRpcFRleHQoIkNlcnRpZmljYXRlJ3MgaXNzdWVyIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlDb2wgPT0gMyl7IC8vU2VyaWFsIG51bWJlcgorICAgICAgICAgICAgICAgICAgICBoZWFkZXIuc2V0VG9vbFRpcFRleHQoIkNlcnRpZmljYXRlJ3Mgc2VyaWFsIG51bWJlciIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKGlDb2wgPT0gNCkgeyAvLyBMYXN0IG1vZGlmaWVkIGNvbHVtbgorICAgICAgICAgICAgICAgICAgICBoZWFkZXIuc2V0VG9vbFRpcFRleHQoIkxhc3QgbW9kaWZpY2F0aW9uIGRhdGUgYW5kIHRpbWUiKTsKKyAgICAgICAgICAgICAgICB9ICAgICAgICAJCisgICAgICAgICAgICB9ICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgaGVhZGVyLnNldEJvcmRlcihuZXcgQ29tcG91bmRCb3JkZXIoCisgICAgICAgICAgICBuZXcgQmV2ZWxCb3JkZXIoQmV2ZWxCb3JkZXIuUkFJU0VEKSwgbmV3IEVtcHR5Qm9yZGVyKDAsIDUsIDAsIDUpKSk7CisKKyAgICAgICAgcmV0dXJuIGhlYWRlcjsKKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9uZXQvc2YvdGF2ZXJuYS90Mi93b3JrYmVuY2gvdWkvY3JlZGVudGlhbG1hbmFnZXIvVHJ1c3RlZENlcnRzVGFibGVNb2RlbC5qYXZhIGIvc3JjL21haW4vamF2YS9uZXQvc2YvdGF2ZXJuYS90Mi93b3JrYmVuY2gvdWkvY3JlZGVudGlhbG1hbmFnZXIvVHJ1c3RlZENlcnRzVGFibGVNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkN2RhMDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL25ldC9zZi90YXZlcm5hL3QyL3dvcmtiZW5jaC91aS9jcmVkZW50aWFsbWFuYWdlci9UcnVzdGVkQ2VydHNUYWJsZU1vZGVsLmphdmEKQEAgLTAsMCArMSwyMzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIFVuaXZlcnNpdHkgb2YgTWFuY2hlc3RlciAgIAorICogCisgKiAgTW9kaWZpY2F0aW9ucyB0byB0aGUgaW5pdGlhbCBjb2RlIGJhc2UgYXJlIGNvcHlyaWdodCBvZiB0aGVpcgorICogIHJlc3BlY3RpdmUgYXV0aG9ycywgb3IgdGhlaXIgZW1wbG95ZXJzIGFzIGFwcHJvcHJpYXRlLgorICogCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAgIAorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogICAgCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBuZXQuc2YudGF2ZXJuYS50Mi53b3JrYmVuY2gudWkuY3JlZGVudGlhbG1hbmFnZXI7CisKK2ltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7CitpbXBvcnQgamF2YXguc3dpbmcuSk9wdGlvblBhbmU7CitpbXBvcnQgamF2YXguc3dpbmcudGFibGUuQWJzdHJhY3RUYWJsZU1vZGVsOworCitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7CisKK2ltcG9ydCBuZXQuc2YudGF2ZXJuYS50Mi5sYW5nLm9ic2VydmVyLk9ic2VydmFibGU7CitpbXBvcnQgbmV0LnNmLnRhdmVybmEudDIubGFuZy5vYnNlcnZlci5PYnNlcnZlcjsKK2ltcG9ydCBuZXQuc2YudGF2ZXJuYS50Mi5zZWN1cml0eS5jcmVkZW50aWFsbWFuYWdlci5DTUV4Y2VwdGlvbjsKK2ltcG9ydCBuZXQuc2YudGF2ZXJuYS50Mi5zZWN1cml0eS5jcmVkZW50aWFsbWFuYWdlci5DcmVkZW50aWFsTWFuYWdlcjsKK2ltcG9ydCBuZXQuc2YudGF2ZXJuYS50Mi5zZWN1cml0eS5jcmVkZW50aWFsbWFuYWdlci5LZXlzdG9yZUNoYW5nZWRFdmVudDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CisKKy8qKgorICogVGhlIHRhYmxlIG1vZGVsIHVzZWQgdG8gZGlzcGxheSB0aGUgS2V5c3RvcmUncyB0cnVzdGVkIGNlcnRpZmljYXRlIGVudHJpZXMuCisgKiAKKyAqIEBhdXRob3IgQWxleCBOZW5hZGljCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQorcHVibGljIGNsYXNzIFRydXN0ZWRDZXJ0c1RhYmxlTW9kZWwgZXh0ZW5kcyBBYnN0cmFjdFRhYmxlTW9kZWwgaW1wbGVtZW50cyBPYnNlcnZlcjxLZXlzdG9yZUNoYW5nZWRFdmVudD57CisJCisJLy8gQ29sdW1uIG5hbWVzIAorICAgIHByaXZhdGUgU3RyaW5nW10gY29sdW1uTmFtZXM7CisKKyAgICAvLyBUYWJsZSBkYXRhIAorICAgIHByaXZhdGUgT2JqZWN0W11bXSBkYXRhOworICAgIAorCXByaXZhdGUgQ3JlZGVudGlhbE1hbmFnZXIgY3JlZE1hbmFnZXI7CisJCisJcHJpdmF0ZSBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihUcnVzdGVkQ2VydHNUYWJsZU1vZGVsLmNsYXNzKTsKKworCQorICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBUcnVzdENlcnRzVGFibGVNb2RlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVHJ1c3RlZENlcnRzVGFibGVNb2RlbCgpIHsKKyAgICAgICAgY3JlZE1hbmFnZXIgPSBudWxsOworICAgICAgICB0cnl7CisgICAgICAgIAljcmVkTWFuYWdlciA9IENyZWRlbnRpYWxNYW5hZ2VyLmdldEluc3RhbmNlKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKENNRXhjZXB0aW9uIGNtZSl7CisJCQkvLyBGYWlsZWQgdG8gaW5zdGFudGlhdGUgQ3JlZGVudGlhbCBNYW5hZ2VyIC0gd2FybiB0aGUgdXNlciBhbmQgZXhpdAorCQkJU3RyaW5nIHNNZXNzYWdlID0gIkZhaWxlZCB0byBpbnN0YW50aWF0ZSBDcmVkZW50aWFsIE1hbmFnZXIuICIgKyBjbWUuZ2V0TWVzc2FnZSgpOworCQkJbG9nZ2VyLmVycm9yKCJDTSBHVUk6ICIrIHNNZXNzYWdlKTsKKwkJCWNtZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKG5ldyBKRnJhbWUoKSwgc01lc3NhZ2UsCisJCQkJCSJDcmVkZW50aWFsIE1hbmFnZXIgRXJyb3IiLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKwkJCXJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAJZGF0YSA9IG5ldyBPYmplY3RbMF1bMF07CisgICAgICAgIGNvbHVtbk5hbWVzID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgCSJFbnRyeSBUeXBlIiwgLy8gdHlwZSBvZiB0aGUgS2V5c3RvcmUgZW50cnkKKyAgICAgICAgCSJPd25lciIsIC8vIG93bmVyJ3MgY29tbW9uIG5hbWUKKyAgICAgICAgCSJJc3N1ZXIiLCAvLyBpc3N1ZXIncyBjb21tb24gbmFtZQorICAgICAgICAJIlNlcmlhbCBOdW1iZXIiLCAvLyBwdWJsaWMga2V5IGNlcnRpZmljYXRlJ3Mgc2VyaWFsIG51bWJlcgorICAgICAgICAgICAgIkxhc3QgTW9kaWZpZWQiLCAvLyBsYXN0IG1vZGlmaWVkIGRhdGUgb2YgdGhlIGVudHJ5CisgICAgICAgICAgICAiQWxpYXMiIC8vIHRoZSBpbnZpc2libGUgY29sdW1uIGhvbGRpbmcgdGhlIGFjdHVhbCBhbGlhcyBpbiB0aGUgS2V5c3RvcmUKKyAgICAgICAgICAgIH07CisgICAgICAgIAorICAgICAgICB0cnkgeworCQkJbG9hZCgpOworCQl9IGNhdGNoIChDTUV4Y2VwdGlvbiBjbWUpIHsKKwkJCVN0cmluZyBzTWVzc2FnZSA9ICJGYWlsZWQgdG8gbG9hZCB0cnVzdGVkIGNlcnRpZmljYXRlcyI7CisJCQlsb2dnZXIuZXJyb3Ioc01lc3NhZ2UpOworCQkJY21lLnByaW50U3RhY2tUcmFjZSgpOworCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2cobmV3IEpGcmFtZSgpLCBzTWVzc2FnZSwKKwkJCQkJIkNyZWRlbnRpYWwgTWFuYWdlciBFcnJvciIsIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOworCQkJcmV0dXJuOworCQl9CisJCQorICAgICAgICAvLyBTdGFydCBvYnNlcnZpbmcgY2hhbmdlcyB0byB0aGUgS2V5c3RvcmUKKyAgICAgICAgY3JlZE1hbmFnZXIuYWRkT2JzZXJ2ZXIodGhpcyk7CisgICAgfQorICAgIAkgICAKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoZSBUcnVzdENlcnRzVGFibGVNb2RlbCB3aXRoIHRydXN0ZWQgY2VydGlmaWNhdGUgZW50cmllcyBmcm9tIHRoZSBLZXlzdG9yZS4gCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9hZCgpIHRocm93cyBDTUV4Y2VwdGlvbiB7CisgICAgICAgIHRyeXsKKyAgICAgICAgICAgIC8vIFBsYWNlIHRydXN0ZWQgY2VydGlmaWNhdGUgZW50cmllcycgYWxpYXNlcyBpbiBhIHRyZWUgbWFwIHRvIHNvcnQgdGhlbQorICAgICAgICAgICAgVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4gc29ydGVkQWxpYXNlcyA9IG5ldyBUcmVlTWFwPFN0cmluZywgU3RyaW5nPigpOyAgCisgICAgICAgICAgICAJCisgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBhbGlhc2VzID0gY3JlZE1hbmFnZXIuZ2V0QWxpYXNlcyhDcmVkZW50aWFsTWFuYWdlci5UUlVTVFNUT1JFKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAJZm9yIChTdHJpbmcgYWxpYXM6IGFsaWFzZXMpeworICAgICAgICAJCS8vIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdHJ1c3RlZCBjZXJ0aWZpY2F0ZSBlbnRyaWVzIGhlcmUuCisgICAgICAgIAkJLy8gQWxpYXMgZm9yIHN1Y2ggZW50cmllcyBpcyBjb25zdHJ1Y3RlZCBhcyAidHJ1c3RlZGNlcnQjPENFUlRfU0VSSUFMX05VTUJFUj4jPENFUlRfQ09NTU9OX05BTUU+IgorICAgICAgICAJCWlmIChhbGlhcy5zdGFydHNXaXRoKCJ0cnVzdGVkY2VydCMiKSl7CisgICAgICAgIAkJCXNvcnRlZEFsaWFzZXMucHV0KGFsaWFzLCBhbGlhcyk7CisgICAgICAgIAkJfQorICAgICAgICAJfQorICAgICAgICAJCisgICAgICAgICAgICAvLyBDcmVhdGUgb25lIHRhYmxlIHJvdyBmb3IgZWFjaCB0cnVzdGVkIGNlcnRpZmljYXRlIGVudHJ5CisgICAgICAgICAgICAvLyBFYWNoIHJvdyBoYXMgNCBmaWVsZHMgLSB0eXBlLCBvd25lciBuYW1lLCBsYXN0IG1vZGlmaWVkIGRhdGEgYW5kIHRoZSBpbnZpc2libGUgYWxpYXMKKyAgICAgICAgICAgIGRhdGEgPSBuZXcgT2JqZWN0W3NvcnRlZEFsaWFzZXMuc2l6ZSgpXVs2XTsKKworICAgICAgICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBzb3J0ZWQgYWxpYXNlcywgcmV0cmlldmluZyB0aGUgdHJ1c3RlZCBjZXJ0aWZpY2F0ZSAKKyAgICAgICAgICAgIC8vIGVudHJpZXMgYW5kIHBvcHVsYXRpbmcgdGhlIHRhYmxlIG1vZGVsCisgICAgICAgICAgICBpbnQgaUNudCA9IDA7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBhbGlhcyA6IHNvcnRlZEFsaWFzZXMudmFsdWVzKCkpeworICAgICAgICAgICAgICAgIC8vIFBvcHVsYXRlIHRoZSB0eXBlIGNvbHVtbiAtIGl0IGlzIHNldCB3aXRoIGFuIGludGVnZXIKKyAgICAgICAgICAgICAgICAvLyBidXQgYSBjdXN0b20gY2VsbCByZW5kZXJlciB3aWxsIGNhdXNlIGEgc3VpdGFibGUgaWNvbgorICAgICAgICAgICAgICAgIC8vIHRvIGJlIGRpc3BsYXllZAorICAgICAgICAgICAgICAgIGRhdGFbaUNudF1bMF0gPSBDcmVkZW50aWFsTWFuYWdlclVJLlRSVVNUX0NFUlRfRU5UUllfVFlQRTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBTcGxpdCB0aGUgYWxpYXMgc3RyaW5nIHRvIGV4dHJhY3Qgb3duZXIsIGlzc3VlciBhbmQgc2VyaWFsIG51bWJlciAKKyAgICAgICAgICAgICAgICAvLyBhbGlhcyA9ICJ0cnVzdGVkY2VydCM8Q0VSVF9TVUJKRUNUX0NPTU1PTl9OQU1FPiIjIjxDRVJUX0lTU1VFUl9DT01NT05fTkFNRT4iIyI8Q0VSVF9TRVJJQUxfTlVNQkVSPgorICAgICAgICAgICAgICAgIFN0cmluZ1tdIGFsaWFzQ29tcG9uZW50cyA9IGFsaWFzLnNwbGl0KCIjIik7CisgICAgICAgCisgICAgICAgICAgICAgICAgLy8gUG9wdWxhdGUgdGhlIG93bmVyIGNvbHVtbiBleHRyYWN0ZWQgZnJvbSB0aGUgYWxpYXMKKyAgICAgICAgICAgICAgICBkYXRhW2lDbnRdWzFdID0gYWxpYXNDb21wb25lbnRzWzFdOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIFBvcHVsYXRlIHRoZSBpc3N1ZXIgY29sdW1uIGV4dHJhY3RlZCBmcm9tIHRoZSBhbGlhcworICAgICAgICAgICAgICAgIGRhdGFbaUNudF1bMl0gPSBhbGlhc0NvbXBvbmVudHNbMl07CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gUG9wdWxhdGUgdGhlIHNlcmlhbCBudW1iZXIgY29sdW1uIGV4dHJhY3RlZCBmcm9tIHRoZSBhbGlhcworICAgICAgICAgICAgICAgIGRhdGFbaUNudF1bM10gPSBhbGlhc0NvbXBvbmVudHNbM107CisgICAgICAgICAgICAJCisgICAgICAgICAgICAgICAgLy8gUG9wdWxhdGUgdGhlIG1vZGlmaWVkIGRhdGUgY29sdW1uCisgICAgICAgICAgICAgICAgZGF0YVtpQ250XVs0XSA9IGNyZWRNYW5hZ2VyLmdldEVudHJ5Q3JlYXRpb25EYXRlKENyZWRlbnRpYWxNYW5hZ2VyLlRSVVNUU1RPUkUsIGFsaWFzKTsKKworICAgICAgICAgICAgICAgIC8vIFBvcHVsYXRlIHRoZSBpbnZpc2libGUgYWxpYXMgY29sdW1uCisgICAgICAgICAgICAgICAgZGF0YVtpQ250XVs1XSA9IGFsaWFzOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlDbnQgKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKENNRXhjZXB0aW9uIGNtZSl7CisJCQkgdGhyb3cgKGNtZSk7CisgICAgICAgIH0KKworICAgICAgICBmaXJlVGFibGVEYXRhQ2hhbmdlZCgpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSB0YWJsZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBjb2x1bW5zCisgICAgICovCisgICAgcHVibGljIGludCBnZXRDb2x1bW5Db3VudCgpCisgICAgeworICAgICAgICByZXR1cm4gY29sdW1uTmFtZXMubGVuZ3RoOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIHRhYmxlLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIHJvd3MKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFJvd0NvdW50KCkKKyAgICB7CisgICAgICAgIHJldHVybiBkYXRhLmxlbmd0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaUNvbCBUaGUgY29sdW1uIHBvc2l0aW9uCisgICAgICogQHJldHVybiBUaGUgY29sdW1uIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtbk5hbWUoaW50IGlDb2wpCisgICAgeworICAgICAgICByZXR1cm4gY29sdW1uTmFtZXNbaUNvbF07CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjZWxsIHZhbHVlIGF0IHRoZSBnaXZlbiByb3cgYW5kIGNvbHVtbiBwb3NpdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpUm93IFRoZSByb3cgcG9zaXRpb24KKyAgICAgKiBAcGFyYW0gaUNvbCBUaGUgY29sdW1uIHBvc2l0aW9uCisgICAgICogQHJldHVybiBUaGUgY2VsbCB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWVBdChpbnQgaVJvdywgaW50IGlDb2wpCisgICAgeworICAgICAgICByZXR1cm4gZGF0YVtpUm93XVtpQ29sXTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNsYXNzIGF0IG9mIHRoZSBjZWxscyBhdCB0aGUgZ2l2ZW4gY29sdW1uIHBvc2l0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGlDb2wgVGhlIGNvbHVtbiBwb3NpdGlvbgorICAgICAqIEByZXR1cm4gVGhlIGNvbHVtbiBjZWxscycgY2xhc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIE9iamVjdD4gZ2V0Q29sdW1uQ2xhc3MoaW50IGlDb2wpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0VmFsdWVBdCgwLCBpQ29sKS5nZXRDbGFzcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElzIHRoZSBjZWxsIGF0IHRoZSBnaXZlbiByb3cgYW5kIGNvbHVtbiBwb3NpdGlvbiBlZGl0YWJsZT8KKyAgICAgKgorICAgICAqIEBwYXJhbSBpUm93IFRoZSByb3cgcG9zaXRpb24KKyAgICAgKiBAcGFyYW0gaUNvbCBUaGUgY29sdW1uIHBvc2l0aW9uCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBjZWxsIGlzIGVkaXRhYmxlLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NlbGxFZGl0YWJsZShpbnQgaVJvdywgaW50IGlDb2wpCisgICAgeworICAgICAgICAvLyBUaGUgdGFibGUgaXMgYWx3YXlzIHJlYWQtb25seQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisJcHVibGljIHZvaWQgbm90aWZ5KE9ic2VydmFibGU8S2V5c3RvcmVDaGFuZ2VkRXZlbnQ+IHNlbmRlciwKKwkJCUtleXN0b3JlQ2hhbmdlZEV2ZW50IG1lc3NhZ2UpIHRocm93cyBFeGNlcHRpb24geworCisJCS8vIHJlbG9hZCB0aGUgdGFibGUKKwkJaWYgKG1lc3NhZ2Uua2V5c3RvcmVUeXBlLmVxdWFscyhDcmVkZW50aWFsTWFuYWdlci5UUlVTVFNUT1JFKSl7CisJCQlsb2FkKCk7CisJCX0KKwl9ICAgIAorCit9CisKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvbmV0L3NmL3RhdmVybmEvdDIvd29ya2JlbmNoL3VpL2NyZWRlbnRpYWxtYW5hZ2VyL1ZpZXdDYUdyaWRQcm94eUNlcnREZXRhaWxzRGlhbG9nLmphdmEgYi9zcmMvbWFpbi9qYXZhL25ldC9zZi90YXZlcm5hL3QyL3dvcmtiZW5jaC91aS9jcmVkZW50aWFsbWFuYWdlci9WaWV3Q2FHcmlkUHJveHlDZXJ0RGV0YWlsc0RpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZTcyY2UKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL25ldC9zZi90YXZlcm5hL3QyL3dvcmtiZW5jaC91aS9jcmVkZW50aWFsbWFuYWdlci9WaWV3Q2FHcmlkUHJveHlDZXJ0RGV0YWlsc0RpYWxvZy5qYXZhCkBAIC0wLDAgKzEsNjAwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBVbml2ZXJzaXR5IG9mIE1hbmNoZXN0ZXIgICAKKyAqIAorICogIE1vZGlmaWNhdGlvbnMgdG8gdGhlIGluaXRpYWwgY29kZSBiYXNlIGFyZSBjb3B5cmlnaHQgb2YgdGhlaXIKKyAqICByZXNwZWN0aXZlIGF1dGhvcnMsIG9yIHRoZWlyIGVtcGxveWVycyBhcyBhcHByb3ByaWF0ZS4KKyAqIAorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAgICAKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqICAgIAorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2UgbmV0LnNmLnRhdmVybmEudDIud29ya2JlbmNoLnVpLmNyZWRlbnRpYWxtYW5hZ2VyOworCitpbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OworaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKK2ltcG9ydCBqYXZhLmF3dC5GbG93TGF5b3V0OworaW1wb3J0IGphdmEuYXd0LkdyaWRCYWdDb25zdHJhaW50czsKK2ltcG9ydCBqYXZhLmF3dC5HcmlkQmFnTGF5b3V0OworaW1wb3J0IGphdmEuYXd0Lkluc2V0czsKK2ltcG9ydCBqYXZhLmF3dC5Gb250OworaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OworaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOworaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0FkYXB0ZXI7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQ7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK2ltcG9ydCBqYXZheC5zd2luZy5Cb3hMYXlvdXQ7CitpbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKK2ltcG9ydCBqYXZheC5zd2luZy5KRGlhbG9nOworaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKK2ltcG9ydCBqYXZheC5zd2luZy5KTGFiZWw7CitpbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOworaW1wb3J0IGphdmF4LnN3aW5nLkpUZXh0RmllbGQ7CitpbXBvcnQgamF2YXguc3dpbmcuU3dpbmdVdGlsaXRpZXM7CitpbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkNvbXBvdW5kQm9yZGVyOworaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5FbXB0eUJvcmRlcjsKK2ltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuRXRjaGVkQm9yZGVyOworaW1wb3J0IGphdmF4LnN3aW5nLkpTZXBhcmF0b3I7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZTsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbDsKKworaW1wb3J0IG5ldC5zZi50YXZlcm5hLnQyLnNlY3VyaXR5LmNyZWRlbnRpYWxtYW5hZ2VyLkNNRXhjZXB0aW9uOworaW1wb3J0IG5ldC5zZi50YXZlcm5hLnQyLnNlY3VyaXR5LmNyZWRlbnRpYWxtYW5hZ2VyLkNNWDUwOVV0aWw7CisKK2ltcG9ydCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMU9jdGV0U3RyaW5nOworaW1wb3J0IG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJCaXRTdHJpbmc7CitpbXBvcnQgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9jdGV0U3RyaW5nOworaW1wb3J0IG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5taXNjLk5ldHNjYXBlQ2VydFR5cGU7CisKKworLyoqCisgKiBEaXNwbGF5cyB0aGUgZGV0YWlscyBvZiBhIFguNTA5IGNhR3JpZCBwcm94eSBjZXJ0aWZpY2F0ZS4KKyAqIAorICogQGF1dGhvciBBbGV4IE5lbmFkaWMKKyAqLworQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCitwdWJsaWMgY2xhc3MgVmlld0NhR3JpZFByb3h5Q2VydERldGFpbHNEaWFsb2cgZXh0ZW5kcyBKRGlhbG9nIHsgCQorCQorCS8vIExvZ2dlcgorCS8vcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoVmlld0NlcnREZXRhaWxzRGlhbG9nLmNsYXNzKTsKKwkKKwkvLyBTdG9yZXMgY2VydGlmaWNhdGUgdG8gZGlzcGxheQorICAgIHByaXZhdGUgWDUwOUNlcnRpZmljYXRlIGNlcnQ7CisKKwlwcml2YXRlIFN0cmluZyBhdXRoTlNlcnZpY2VVUkw7CisKKwlwcml2YXRlIFN0cmluZyBkb3JpYW5TZXJ2aWNlVVJMOworICAgIAorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBuZXcgVmlld0NhR3JpZFByb3h5Q2VydERpYWxvZyBkaWFsb2cgd2hlcmUgdGhlIHBhcmVudCBpcyBhIGZyYW1lLgorICAgICAqLworICAgIHB1YmxpYyBWaWV3Q2FHcmlkUHJveHlDZXJ0RGV0YWlsc0RpYWxvZyhKRnJhbWUgcGFyZW50LCBTdHJpbmcgdGl0bGUsIGJvb2xlYW4gbW9kYWwsCisgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjcnQsIFN0cmluZyBhdXRoTlNlcnZpY2VVUkwsIFN0cmluZyBkb3JpYW5TZXJ2aWNlVVJMKQorICAgICAgICB0aHJvd3MgQ01FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHN1cGVyKHBhcmVudCwgdGl0bGUsIG1vZGFsKTsKKyAgICAgICAgdGhpcy5jZXJ0ID0gY3J0OworICAgICAgICB0aGlzLmF1dGhOU2VydmljZVVSTCA9IGF1dGhOU2VydmljZVVSTDsKKyAgICAgICAgdGhpcy5kb3JpYW5TZXJ2aWNlVVJMID0gZG9yaWFuU2VydmljZVVSTDsKKyAgICAgICAgaW5pdENvbXBvbmVudHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIG5ldyBWaWV3Q2FHcmlkUHJveHlDZXJ0RGlhbG9nIGRpYWxvZyB3aGVyZSB0aGUgcGFyZW50IGlzIGEgZGlhbG9nLgorICAgICAqLworICAgIHB1YmxpYyBWaWV3Q2FHcmlkUHJveHlDZXJ0RGV0YWlsc0RpYWxvZyhKRGlhbG9nIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBib29sZWFuIG1vZGFsLAorICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY3J0LCBTdHJpbmcgYXV0aE5TZXJ2aWNlVVJMLCBTdHJpbmcgZG9yaWFuU2VydmljZVVSTCkKKyAgICAgICAgdGhyb3dzIENNRXhjZXB0aW9uCisgICAgeworICAgICAgICBzdXBlcihwYXJlbnQsIHRpdGxlLCBtb2RhbCk7CisgICAgICAgIGNlcnQgPSBjcnQ7CisgICAgICAgIHRoaXMuYXV0aE5TZXJ2aWNlVVJMID0gYXV0aE5TZXJ2aWNlVVJMOworICAgICAgICB0aGlzLmRvcmlhblNlcnZpY2VVUkwgPSBkb3JpYW5TZXJ2aWNlVVJMOyAgICAgICAgCisgICAgICAgIGluaXRDb21wb25lbnRzKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEluaXRpYWxpc2UgdGhlIGRpYWxvZydzIEdVSSBjb21wb25lbnRzLgorICAgICAqCisgICAgICogQHRocm93cyBDTUV4Y2VwdGlvbiBBIHByb2JsZW0gd2FzIGVuY291bnRlcmVkIGdldHRpbmcgdGhlCisgICAgICogY2VydGlmaWNhdGVzJyBkZXRhaWxzCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluaXRDb21wb25lbnRzKCkKKyAgICAgICAgdGhyb3dzIENNRXhjZXB0aW9uCisgICAgeworCisgICAgICAgIC8vIENlcnRpZmljYXRlIGRldGFpbHM6CisKKyAgICAgICAgLy8gR3JpZCBCYWcgQ29uc3RyYWludHMgdGVtcGxhdGVzIGZvciBsYWJlbHMgKGNvbHVtbiAxKSBhbmQgCisgICAgCS8vIHZhbHVlcyAoY29sdW1uIDIpIG9mIGNlcnRpZmljYXRlIGRldGFpbHMKKyAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzIGdiY0xhYmVsID0gbmV3IEdyaWRCYWdDb25zdHJhaW50cygpOworICAgICAgICBnYmNMYWJlbC5ncmlkeCA9IDA7CisgICAgICAgIGdiY0xhYmVsLmlwYWR4ID0gMjA7CisgICAgICAgIGdiY0xhYmVsLmdyaWR3aWR0aCA9IDE7CisgICAgICAgIGdiY0xhYmVsLmdyaWRoZWlnaHQgPSAxOworICAgICAgICBnYmNMYWJlbC5pbnNldHMgPSBuZXcgSW5zZXRzKDIsIDE1LCAyLCAyKTsKKyAgICAgICAgZ2JjTGFiZWwuYW5jaG9yID0gR3JpZEJhZ0NvbnN0cmFpbnRzLkxJTkVfU1RBUlQ7CisKKyAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzIGdiY1ZhbHVlID0gbmV3IEdyaWRCYWdDb25zdHJhaW50cygpOworICAgICAgICBnYmNWYWx1ZS5ncmlkeCA9IDE7CisgICAgICAgIGdiY1ZhbHVlLmdyaWR3aWR0aCA9IDE7CisgICAgICAgIGdiY1ZhbHVlLmdyaWRoZWlnaHQgPSAxOworICAgICAgICBnYmNWYWx1ZS5pbnNldHMgPSBuZXcgSW5zZXRzKDIsIDUsIDIsIDIpOworICAgICAgICBnYmNWYWx1ZS5hbmNob3IgPSBHcmlkQmFnQ29uc3RyYWludHMuTElORV9TVEFSVDsKKyAgICAgICAgCisgICAgICAgIC8vIE5ldHNjYXBlIENlcnRpZmljYXRlIFR5cGUgbm9uLWNyaXRpY2FsIGV4dGVuc2lvbiAoaWYgYW55KQorICAgICAgICAvLyBkZWZpbmVzIHRoZSBpbnRlbmRlZCB1c2VzIG9mIHRoZSBjZXJ0aWZpY2F0ZSAtIHRvIG1ha2UgaXQgbG9vayBsaWtlIAorICAgICAgICAvLyBmaXJlZm94J3MgdmlldyBjZXJ0aWZpY2F0ZSBkaWFsb2cKKyAgICAgICAgYnl0ZVtdIGludGVuZGVkVXNlcyA9IGNlcnQuZ2V0RXh0ZW5zaW9uVmFsdWUoIjIuMTYuODQwLjEuMTEzNzMwLjEuMSIpOyAvL05ldHNjYXBlIENlcnRpZmljYXRlIFR5cGUgT0lELyoKKyAgICAgICAgSkxhYmVsIGpsSW50ZW5kZWRVc2VzID0gbnVsbDsKKyAgICAgICAgSlRleHRGaWVsZCBqdGZJbnRlbmRlZFVzZXNWYWx1ZSA9IG51bGw7CisgICAgICAgIEpQYW5lbCBqcFVzZXMgPSBudWxsOworICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMgZ2JjX2pwVXNlcyA9IG51bGw7CisgICAgICAgIGlmIChpbnRlbmRlZFVzZXMgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgCWpsSW50ZW5kZWRVc2VzID0gbmV3IEpMYWJlbCgiVGhpcyBjZXJ0aWZpY2F0ZSBoYXMgYmVlbiBhcHByb3ZlZCBmb3IgdGhlIGZvbGxvd2luZyB1c2VzOiIpOworICAgICAgICAgCWpsSW50ZW5kZWRVc2VzLnNldEZvbnQobmV3IEZvbnQobnVsbCwgRm9udC5CT0xELCAxMSkpOworICAgICAgICAgCWpsSW50ZW5kZWRVc2VzLnNldEJvcmRlcihuZXcgRW1wdHlCb3JkZXIoNSw1LDUsNSkpOworICAgICAgICAgCQorICAgICAgICAgCWp0ZkludGVuZGVkVXNlc1ZhbHVlID0gbmV3IEpUZXh0RmllbGQoNDUpOworICAgICAgICAgCWp0ZkludGVuZGVkVXNlc1ZhbHVlLnNldFRleHQoZ2V0SW50ZW5kZWRVc2VzKGludGVuZGVkVXNlcykpOworICAgICAgICAJanRmSW50ZW5kZWRVc2VzVmFsdWUuc2V0RWRpdGFibGUoZmFsc2UpOworICAgICAgICAJanRmSW50ZW5kZWRVc2VzVmFsdWUuc2V0Rm9udChuZXcgRm9udChudWxsLCBGb250LlBMQUlOLCAxMSkpOworICAgICAgICAgICAgIAorICAgICAgICAJanBVc2VzID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOyAKKyAgICAgICAgCWpwVXNlcy5hZGQoamxJbnRlbmRlZFVzZXMsIEJvcmRlckxheW91dC5OT1JUSCk7CisgICAgICAgIAlqcFVzZXMuYWRkKGp0ZkludGVuZGVkVXNlc1ZhbHVlLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKyAgICAgICAgCUpTZXBhcmF0b3IganNwID0gbmV3IEpTZXBhcmF0b3IoSlNlcGFyYXRvci5IT1JJWk9OVEFMKTsKKyAgICAgICAgCWpwVXNlcy5hZGQoanNwLCBCb3JkZXJMYXlvdXQuU09VVEgpOworICAgICAgICAJCisgICAgICAgIAlnYmNfanBVc2VzID0gKEdyaWRCYWdDb25zdHJhaW50cykgZ2JjTGFiZWwuY2xvbmUoKTsKKyAgICAgICAgCWdiY19qcFVzZXMuZ3JpZHkgPSAwOworICAgICAgICAJZ2JjX2pwVXNlcy5ncmlkd2lkdGggPSAyOyAvL3Rha2VzIHR3byBjb2x1bW5zCisgICAgICAgIAlnYmNfanBVc2VzLmluc2V0cyA9IG5ldyBJbnNldHMoNSwgNSwgNSwgNSk7Ly9oYXMgc2xpZ2h0bHkgYmlnZ2VyIGluc2V0cworCisgICAgICAgIH0KKworICAgICAgICAvL0lzc3VlZCBUbworICAgICAgICBKTGFiZWwgamxJc3N1ZWRUbyA9IG5ldyBKTGFiZWwoIklzc3VlZCBUbyIpOworICAgICAgICBqbElzc3VlZFRvLnNldEZvbnQobmV3IEZvbnQobnVsbCwgRm9udC5CT0xELCAxMSkpOworICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMgZ2JjX2psSXNzdWVkVG8gPSAoR3JpZEJhZ0NvbnN0cmFpbnRzKSBnYmNMYWJlbC5jbG9uZSgpOworICAgICAgICBnYmNfamxJc3N1ZWRUby5ncmlkeSA9IDE7CisgICAgICAgIGdiY19qbElzc3VlZFRvLmdyaWR3aWR0aCA9IDI7IC8vdGFrZXMgdHdvIGNvbHVtbnMKKyAgICAgICAgZ2JjX2psSXNzdWVkVG8uaW5zZXRzID0gbmV3IEluc2V0cyg1LCA1LCA1LCA1KTsvL2hhcyBzbGlnaHRseSBiaWdnZXIgaW5zZXRzCisgICAgICAgIC8vIERpc3Rpbmd1aXNoZWQgTmFtZSAoRE4pCisJCVN0cmluZyBzRE4gPSBjZXJ0LmdldFN1YmplY3RYNTAwUHJpbmNpcGFsKCkuZ2V0TmFtZShYNTAwUHJpbmNpcGFsLlJGQzIyNTMpOworCQlDTVg1MDlVdGlsIHV0aWwgPSBuZXcgQ01YNTA5VXRpbCgpOworCQl1dGlsLnBhcnNlRE4oc0ROKTsgICAgICAgCisJCS8vIEV4dHJhY3QgdGhlIENOLCBPLCBPVSBhbmQgRU1BSUxBRERSRVNTIGZpZWxkcworICAgICAgICBTdHJpbmcgc0NOID0gdXRpbC5nZXRDTigpOworICAgICAgICBTdHJpbmcgc09yZyA9IHV0aWwuZ2V0TygpOworICAgICAgICBTdHJpbmcgc09VID0gdXRpbC5nZXRPVSgpOworICAgICAgICAvL1N0cmluZyBzRU1BSUxBRERSRVNTID0gQ01YNTA5VXRpbC5nZXRFbWlsQWRkcmVzcygpOworICAgICAgICAvLyBDb21tb24gTmFtZSAoQ04pCisgICAgICAgIEpMYWJlbCBqbENOID0gbmV3IEpMYWJlbCgiQ29tbW9uIE5hbWUgKENOKSIpOworICAgICAgICBqbENOLnNldEZvbnQobmV3IEZvbnQobnVsbCwgRm9udC5QTEFJTiwgMTEpKTsKKyAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzIGdiY19qbENOID0gKEdyaWRCYWdDb25zdHJhaW50cykgZ2JjTGFiZWwuY2xvbmUoKTsKKyAgICAgICAgZ2JjX2psQ04uZ3JpZHkgPSAyOworICAgICAgICBKTGFiZWwgamxDTlZhbHVlID0gbmV3IEpMYWJlbChzQ04pOworICAgICAgICBqbENOVmFsdWUuc2V0Rm9udChuZXcgRm9udChudWxsLCBGb250LlBMQUlOLCAxMSkpOworICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMgZ2JjX2psQ05WYWx1ZSA9IChHcmlkQmFnQ29uc3RyYWludHMpIGdiY1ZhbHVlLmNsb25lKCk7CisgICAgICAgIGdiY19qbENOVmFsdWUuZ3JpZHkgPSAyOworICAgICAgICAvLyBPcmdhbmlzYXRpb24gKE8pCisgICAgICAgIEpMYWJlbCBqbE9yZyA9IG5ldyBKTGFiZWwoIk9yZ2FuaXNhdGlvbiAoTykiKTsKKyAgICAgICAgamxPcmcuc2V0Rm9udChuZXcgRm9udChudWxsLCBGb250LlBMQUlOLCAxMSkpOworICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMgZ2JjX2psT3JnID0gKEdyaWRCYWdDb25zdHJhaW50cykgZ2JjTGFiZWwuY2xvbmUoKTsKKyAgICAgICAgZ2JjX2psT3JnLmdyaWR5ID0gMzsKKyAgICAgICAgSkxhYmVsIGpsT3JnVmFsdWUgPSBuZXcgSkxhYmVsKHNPcmcpOworICAgICAgICBqbE9yZ1ZhbHVlLnNldEZvbnQobmV3IEZvbnQobnVsbCwgRm9udC5QTEFJTiwgMTEpKTsKKyAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzIGdiY19qbE9yZ1ZhbHVlID0gKEdyaWRCYWdDb25zdHJhaW50cykgZ2JjVmFsdWUuY2xvbmUoKTsKKyAgICAgICAgZ2JjX2psT3JnVmFsdWUuZ3JpZHkgPSAzOworICAgICAgICAvLyBPcmdhbmlzYXRpb24gVW5pdCAoT1UpCisgICAgICAgIEpMYWJlbCBqbE9VID0gbmV3IEpMYWJlbCgiT3JnYW5pc2F0aW9uIFVuaXQgKE9VKSIpOworICAgICAgICBqbE9VLnNldEZvbnQobmV3IEZvbnQobnVsbCwgRm9udC5QTEFJTiwgMTEpKTsKKyAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzIGdiY19qbE9VID0gKEdyaWRCYWdDb25zdHJhaW50cykgZ2JjTGFiZWwuY2xvbmUoKTsKKyAgICAgICAgZ2JjX2psT1UuZ3JpZHkgPSA0OworICAgICAgICBKTGFiZWwgamxPVVZhbHVlID0gbmV3IEpMYWJlbChzT1UpOworICAgICAgICBqbE9VVmFsdWUuc2V0Rm9udChuZXcgRm9udChudWxsLCBGb250LlBMQUlOLCAxMSkpOworICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMgZ2JjX2psT1VWYWx1ZSA9IChHcmlkQmFnQ29uc3RyYWludHMpIGdiY1ZhbHVlLmNsb25lKCk7CisgICAgICAgIGdiY19qbE9VVmFsdWUuZ3JpZHkgPSA0OworICAgICAgICAvLyBFLW1haWwgQWRkcmVzcworICAgICAgICAvL0pMYWJlbCBqbEVtYWlsID0gbmV3IEpMYWJlbCgiRS1tYWlsIEFkZHJlc3MiKTsKKyAgICAgICAgLy9qbEVtYWlsLnNldEZvbnQobmV3IEZvbnQobnVsbCwgRm9udC5QTEFJTiwgMTEpKTsKKyAgICAgICAgLy9HcmlkQmFnQ29uc3RyYWludHMgZ2JjX2psRW1haWwgPSAoR3JpZEJhZ0NvbnN0cmFpbnRzKSBnYmNMYWJlbC5jbG9uZSgpOworICAgICAgICAvL2diY19qbEVtYWlsLmdyaWR5ID0gNTsKKyAgICAgICAgLy9KTGFiZWwgamxFbWFpbFZhbHVlID0gbmV3IEpMYWJlbChzRU1BSUxBRERSRVNTKTsKKyAgICAgICAgLy9qbEVtYWlsVmFsdWUuc2V0Rm9udChuZXcgRm9udChudWxsLCBGb250LlBMQUlOLCAxMSkpOworICAgICAgICAvL0dyaWRCYWdDb25zdHJhaW50cyBnYmNfamxFbWFpbFZhbHVlID0gKEdyaWRCYWdDb25zdHJhaW50cykgZ2JjVmFsdWUuY2xvbmUoKTsKKyAgICAgICAgLy9nYmNfamxFbWFpbFZhbHVlLmdyaWR5ID0gNTsKKyAgICAgICAgLy8gU2VyaWFsIE51bWJlcgorICAgICAgICBKTGFiZWwgamxTTiA9IG5ldyBKTGFiZWwoIlNlcmlhbCBOdW1iZXIiKTsKKyAgICAgICAgamxTTi5zZXRGb250KG5ldyBGb250KG51bGwsIEZvbnQuUExBSU4sIDExKSk7CisgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cyBnYmNfamxTTiA9IChHcmlkQmFnQ29uc3RyYWludHMpIGdiY0xhYmVsLmNsb25lKCk7CisgICAgICAgIGdiY19qbFNOLmdyaWR5ID0gNjsKKyAgICAgICAgSkxhYmVsIGpsU05WYWx1ZSA9IG5ldyBKTGFiZWwoKTsKKyAgICAgICAgLy8gR2V0IHRoZSBoZXhhZGVjaW1hbCBzZXJpYWwgbnVtYmVyCisgICAgICAgIFN0cmluZ0J1ZmZlciBzdHJCdWZmID0gbmV3IFN0cmluZ0J1ZmZlciAobmV3IEJpZ0ludGVnZXIoMSwKKyAgICAgICAgICAgICAgICBjZXJ0LmdldFNlcmlhbE51bWJlcigpLnRvQnl0ZUFycmF5KCkpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpKTsKKyAgICAgICAgLy8gUGxhY2UgY29sb25zIGF0IGV2ZXJ5IHR3byBoZXhhZGVjaW1hbCBjaGFyYWN0ZXJzCisgICAgICAgIGlmIChzdHJCdWZmLmxlbmd0aCgpID4gMikgeworICAgICAgICAgICAgZm9yIChpbnQgaUNudCA9IDI7IGlDbnQgPCBzdHJCdWZmLmxlbmd0aCgpOyBpQ250ICs9IDMpIHsKKyAgICAgICAgICAgICAgICBzdHJCdWZmLmluc2VydChpQ250LCAnOicpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGpsU05WYWx1ZS5zZXRUZXh0KHN0ckJ1ZmYudG9TdHJpbmcoKSk7CisgICAgICAgIGpsU05WYWx1ZS5zZXRGb250KG5ldyBGb250KG51bGwsIEZvbnQuUExBSU4sIDExKSk7CisgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cyBnYmNfamxTTlZhbHVlID0gKEdyaWRCYWdDb25zdHJhaW50cykgZ2JjVmFsdWUuY2xvbmUoKTsKKyAgICAgICAgZ2JjX2psU05WYWx1ZS5ncmlkeSA9IDY7CisgICAgICAgIC8vIFZlcnNpb24KKyAgICAgICAgSkxhYmVsIGpsVmVyc2lvbiA9IG5ldyBKTGFiZWwoIlZlcnNpb24iKTsKKyAgICAgICAgamxWZXJzaW9uLnNldEZvbnQobmV3IEZvbnQobnVsbCwgRm9udC5QTEFJTiwgMTEpKTsKKyAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzIGdiY19qbFZlcnNpb24gPSAoR3JpZEJhZ0NvbnN0cmFpbnRzKSBnYmNMYWJlbC5jbG9uZSgpOworICAgICAgICBnYmNfamxWZXJzaW9uLmdyaWR5ID0gNzsKKyAgICAgICAgSkxhYmVsIGpsVmVyc2lvblZhbHVlID0gbmV3IEpMYWJlbChJbnRlZ2VyLnRvU3RyaW5nKGNlcnQuZ2V0VmVyc2lvbigpKSk7CisgICAgICAgIGpsVmVyc2lvblZhbHVlLnNldEZvbnQobmV3IEZvbnQobnVsbCwgRm9udC5QTEFJTiwgMTEpKTsKKyAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzIGdiY19qbFZlcnNpb25WYWx1ZSA9IChHcmlkQmFnQ29uc3RyYWludHMpIGdiY1ZhbHVlLmNsb25lKCk7CisgICAgICAgIGdiY19qbFZlcnNpb25WYWx1ZS5ncmlkeSA9IDc7CisKKyAgICAgICAgLy8gSXNzdWVkIEJ5CisgICAgICAgIEpMYWJlbCBqbElzc3VlZEJ5ID0gbmV3IEpMYWJlbCgiSXNzdWVkIEJ5Iik7CisgICAgICAgIGpsSXNzdWVkQnkuc2V0Rm9udChuZXcgRm9udChudWxsLCBGb250LkJPTEQsIDExKSk7CisgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cyBnYmNfamxJc3N1ZWRCeSA9IChHcmlkQmFnQ29uc3RyYWludHMpIGdiY0xhYmVsLmNsb25lKCk7CisgICAgICAgIGdiY19qbElzc3VlZEJ5LmdyaWR5ID0gODsKKyAgICAgICAgZ2JjX2psSXNzdWVkQnkuZ3JpZHdpZHRoID0gMjsgLy90YWtlcyB0d28gY29sdW1ucyAKKyAgICAgICAgZ2JjX2psSXNzdWVkQnkuaW5zZXRzID0gbmV3IEluc2V0cyg1LCA1LCA1LCA1KTsvL2hhcyBzbGlnaHRseSBiaWdnZXIgaW5zZXRzICAgICAgICAKKyAgICAgICAgLy8gRGlzdGluZ3Vpc2hlZCBOYW1lIChETikgICAgICAgCisJCVN0cmluZyBpRE4gPSBjZXJ0LmdldElzc3Vlclg1MDBQcmluY2lwYWwoKS5nZXROYW1lKFg1MDBQcmluY2lwYWwuUkZDMjI1Myk7CisJCXV0aWwucGFyc2VETihpRE4pOyAgICAgICAgCisgICAgICAgIC8vIEV4dHJhY3QgdGhlIENOLCBPIGFuZCBPVSBmaWVsZHMKKyAgICAgICAgU3RyaW5nIGlDTiA9IHV0aWwuZ2V0Q04oKTsKKyAgICAgICAgU3RyaW5nIGlPcmcgPSB1dGlsLmdldE8oKTsKKyAgICAgICAgU3RyaW5nIGlPVSA9IHV0aWwuZ2V0T1UoKTsgICAJCisgICAgICAgIC8vIENvbW1vbiBOYW1lIChDTikKKyAgICAgICAgSkxhYmVsIGpsSUNOID0gbmV3IEpMYWJlbCgiQ29tbW9uIE5hbWUgKENOKSIpOworICAgICAgICBqbElDTi5zZXRGb250KG5ldyBGb250KG51bGwsIEZvbnQuUExBSU4sIDExKSk7CisgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cyBnYmNfamxJQ04gPSAoR3JpZEJhZ0NvbnN0cmFpbnRzKSBnYmNMYWJlbC5jbG9uZSgpOworICAgICAgICBnYmNfamxJQ04uZ3JpZHkgPSA5OworICAgICAgICBKTGFiZWwgamxJQ05WYWx1ZSA9IG5ldyBKTGFiZWwoaUNOKTsKKyAgICAgICAgamxJQ05WYWx1ZS5zZXRGb250KG5ldyBGb250KG51bGwsIEZvbnQuUExBSU4sIDExKSk7CisgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cyBnYmNfamxJQ05WYWx1ZSA9IChHcmlkQmFnQ29uc3RyYWludHMpIGdiY1ZhbHVlLmNsb25lKCk7CisgICAgICAgIGdiY19qbElDTlZhbHVlLmdyaWR5ID0gOTsKKyAgICAgICAgLy8gT3JnYW5pc2F0aW9uIChPKQorICAgICAgICBKTGFiZWwgamxJT3JnID0gbmV3IEpMYWJlbCgiT3JnYW5pc2F0aW9uIChPKSIpOworICAgICAgICBqbElPcmcuc2V0Rm9udChuZXcgRm9udChudWxsLCBGb250LlBMQUlOLCAxMSkpOworICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMgZ2JjX2psSU9yZyA9IChHcmlkQmFnQ29uc3RyYWludHMpIGdiY0xhYmVsLmNsb25lKCk7CisgICAgICAgIGdiY19qbElPcmcuZ3JpZHkgPSAxMDsKKyAgICAgICAgSkxhYmVsIGpsSU9yZ1ZhbHVlID0gbmV3IEpMYWJlbChpT3JnKTsKKyAgICAgICAgamxJT3JnVmFsdWUuc2V0Rm9udChuZXcgRm9udChudWxsLCBGb250LlBMQUlOLCAxMSkpOworICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMgZ2JjX2psSU9yZ1ZhbHVlID0gKEdyaWRCYWdDb25zdHJhaW50cykgZ2JjVmFsdWUuY2xvbmUoKTsKKyAgICAgICAgZ2JjX2psSU9yZ1ZhbHVlLmdyaWR5ID0gMTA7CisgICAgICAgIC8vIE9yZ2FuaXNhdGlvbiBVbml0IChPVSkKKyAgICAgICAgSkxhYmVsIGpsSU9VID0gbmV3IEpMYWJlbCgiT3JnYW5pc2F0aW9uIFVuaXQgKE9VKSIpOworICAgICAgICBqbElPVS5zZXRGb250KG5ldyBGb250KG51bGwsIEZvbnQuUExBSU4sIDExKSk7CisgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cyBnYmNfamxJT1UgPSAoR3JpZEJhZ0NvbnN0cmFpbnRzKSBnYmNMYWJlbC5jbG9uZSgpOworICAgICAgICBnYmNfamxJT1UuZ3JpZHkgPSAxMTsKKyAgICAgICAgSkxhYmVsIGpsSU9VVmFsdWUgPSBuZXcgSkxhYmVsKGlPVSk7CisgICAgICAgIGpsSU9VVmFsdWUuc2V0Rm9udChuZXcgRm9udChudWxsLCBGb250LlBMQUlOLCAxMSkpOworICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMgZ2JjX2psSU9VVmFsdWUgPSAoR3JpZEJhZ0NvbnN0cmFpbnRzKSBnYmNWYWx1ZS5jbG9uZSgpOworICAgICAgICBnYmNfamxJT1VWYWx1ZS5ncmlkeSA9IDExOyAgICAgICAKKyAgICAgICAgLy8gVmFsaWRpdHkKKyAgICAgICAgSkxhYmVsIGpsVmFsaWRpdHkgPSBuZXcgSkxhYmVsKCJWYWxpZGl0eSIpOworICAgICAgICBqbFZhbGlkaXR5LnNldEZvbnQobmV3IEZvbnQobnVsbCwgRm9udC5CT0xELCAxMSkpOworICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMgZ2JjX2psVmFsaWRpdHkgPSAoR3JpZEJhZ0NvbnN0cmFpbnRzKSBnYmNMYWJlbC5jbG9uZSgpOworICAgICAgICBnYmNfamxWYWxpZGl0eS5ncmlkeSA9IDEyOworICAgICAgICBnYmNfamxWYWxpZGl0eS5ncmlkd2lkdGggPSAyOyAvL3Rha2VzIHR3byBjb2x1bW5zICAgCisgICAgICAgIGdiY19qbFZhbGlkaXR5Lmluc2V0cyA9IG5ldyBJbnNldHMoNSwgNSwgNSwgNSk7Ly9oYXMgc2xpZ2h0bHkgYmlnZ2VyIGluc2V0cworICAgICAgICAvL0lzc3VlZCBPbgorICAgICAgICBKTGFiZWwgamxJc3N1ZWRPbiA9IG5ldyBKTGFiZWwoIklzc3VlZCBPbiIpOworICAgICAgICBqbElzc3VlZE9uLnNldEZvbnQobmV3IEZvbnQobnVsbCwgRm9udC5QTEFJTiwgMTEpKTsKKyAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzIGdiY19qbElzc3VlZE9uID0gKEdyaWRCYWdDb25zdHJhaW50cykgZ2JjTGFiZWwuY2xvbmUoKTsKKyAgICAgICAgZ2JjX2psSXNzdWVkT24uZ3JpZHkgPSAxMzsKKyAgICAgICAgSkxhYmVsIGpsSXNzdWVkT25WYWx1ZSA9IG5ldyBKTGFiZWwoY2VydC5nZXROb3RCZWZvcmUoKS50b1N0cmluZygpKTsKKyAgICAgICAgamxJc3N1ZWRPblZhbHVlLnNldEZvbnQobmV3IEZvbnQobnVsbCwgRm9udC5QTEFJTiwgMTEpKTsKKyAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzIGdiY19qbElzc3VlZE9uVmFsdWUgPSAoR3JpZEJhZ0NvbnN0cmFpbnRzKSBnYmNWYWx1ZS5jbG9uZSgpOworICAgICAgICBnYmNfamxJc3N1ZWRPblZhbHVlLmdyaWR5ID0gMTM7CisgICAgICAgIC8vIEV4cGlyZXMgT24KKyAgICAgICAgSkxhYmVsIGpsRXhwaXJlc09uID0gbmV3IEpMYWJlbCgiRXhwaXJlcyBPbiIpOworICAgICAgICBqbEV4cGlyZXNPbi5zZXRGb250KG5ldyBGb250KG51bGwsIEZvbnQuUExBSU4sIDExKSk7CisgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cyBnYmNfamxFeHBpcmVzT24gPSAoR3JpZEJhZ0NvbnN0cmFpbnRzKSBnYmNMYWJlbC5jbG9uZSgpOworICAgICAgICBnYmNfamxFeHBpcmVzT24uZ3JpZHkgPSAxNDsKKyAgICAgICAgSkxhYmVsIGpsRXhwaXJlc09uVmFsdWUgPSBuZXcgSkxhYmVsKGNlcnQuZ2V0Tm90QWZ0ZXIoKS50b1N0cmluZygpKTsKKyAgICAgICAgamxFeHBpcmVzT25WYWx1ZS5zZXRGb250KG5ldyBGb250KG51bGwsIEZvbnQuUExBSU4sIDExKSk7CisgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cyBnYmNfamxFeHBpcmVzT25WYWx1ZSA9IChHcmlkQmFnQ29uc3RyYWludHMpIGdiY1ZhbHVlLmNsb25lKCk7CisgICAgICAgIGdiY19qbEV4cGlyZXNPblZhbHVlLmdyaWR5ID0gMTQ7CisKKyAgICAgICAgLy8gRmluZ2VycHJpbnRzCisgICAgICAgIGJ5dGVbXSBiQ2VydDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJDZXJ0ID0gY2VydC5nZXRFbmNvZGVkKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDTUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiQ291bGQgbm90IGdldCB0aGUgZW5jb2RlZCBmb3JtIG9mIHRoZSBjZXJ0aWZpY2F0ZS4iLAorICAgICAgICAgICAgICAgIGV4KTsKKyAgICAgICAgfQorICAgICAgICBKTGFiZWwgamxGaW5nZXJwcmludHMgPSBuZXcgSkxhYmVsKCJGaW5nZXJwcmludHMiKTsKKyAgICAgICAgamxGaW5nZXJwcmludHMuc2V0Rm9udChuZXcgRm9udChudWxsLCBGb250LkJPTEQsIDExKSk7CisgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cyBnYmNfamxGaW5nZXJwcmludHMgPSAoR3JpZEJhZ0NvbnN0cmFpbnRzKSBnYmNMYWJlbC5jbG9uZSgpOworICAgICAgICBnYmNfamxGaW5nZXJwcmludHMuZ3JpZHkgPSAxNTsKKyAgICAgICAgZ2JjX2psRmluZ2VycHJpbnRzLmdyaWR3aWR0aCA9IDI7IC8vdGFrZXMgdHdvIGNvbHVtbnMgIAorICAgICAgICBnYmNfamxGaW5nZXJwcmludHMuaW5zZXRzID0gbmV3IEluc2V0cyg1LCA1LCA1LCA1KTsvL2hhcyBzbGlnaHRseSBiaWdnZXIgaW5zZXRzCisgICAgICAgIC8vIFNIQS0xIEZpbmdlcnByaW50CisgICAgICAgIEpMYWJlbCBqbFNIQTFGaW5nZXJwcmludCA9IG5ldyBKTGFiZWwoIlNIQTEgRmluZ2VycHJpbnQiKTsKKyAgICAgICAgamxTSEExRmluZ2VycHJpbnQuc2V0Rm9udChuZXcgRm9udChudWxsLCBGb250LlBMQUlOLCAxMSkpOworICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMgZ2JjX2psU0hBMUZpbmdlcnByaW50ID0gKEdyaWRCYWdDb25zdHJhaW50cykgZ2JjTGFiZWwuY2xvbmUoKTsKKyAgICAgICAgZ2JjX2psU0hBMUZpbmdlcnByaW50LmdyaWR5ID0gMTY7CisgICAgICAgIEpMYWJlbCBqbFNIQTFGaW5nZXJwcmludFZhbHVlID0gbmV3IEpMYWJlbChnZXRNZXNzYWdlRGlnZXN0KGJDZXJ0LCAiU0hBMSIpKTsKKyAgICAgICAgamxTSEExRmluZ2VycHJpbnRWYWx1ZS5zZXRGb250KG5ldyBGb250KG51bGwsIEZvbnQuUExBSU4sIDExKSk7CisgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cyBnYmNfamxTSEExRmluZ2VycHJpbnRWYWx1ZSA9IChHcmlkQmFnQ29uc3RyYWludHMpIGdiY1ZhbHVlLmNsb25lKCk7CisgICAgICAgIGdiY19qbFNIQTFGaW5nZXJwcmludFZhbHVlLmdyaWR5ID0gMTY7CisgICAgICAgIC8vIE1ENSBGaW5nZXJwcmludAorICAgICAgICBKTGFiZWwgamxNRDVGaW5nZXJwcmludCA9IG5ldyBKTGFiZWwoIk1ENSBGaW5nZXJwcmludCIpOworICAgICAgICBqbE1ENUZpbmdlcnByaW50LnNldEZvbnQobmV3IEZvbnQobnVsbCwgRm9udC5QTEFJTiwgMTEpKTsKKyAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzIGdiY19qbE1ENUZpbmdlcnByaW50ID0gKEdyaWRCYWdDb25zdHJhaW50cykgZ2JjTGFiZWwuY2xvbmUoKTsKKyAgICAgICAgZ2JjX2psTUQ1RmluZ2VycHJpbnQuZ3JpZHkgPSAxNzsKKyAgICAgICAgSkxhYmVsIGpsTUQ1RmluZ2VycHJpbnRWYWx1ZSA9IG5ldyBKTGFiZWwoZ2V0TWVzc2FnZURpZ2VzdChiQ2VydCwgIk1ENSIpKTsKKyAgICAgICAgamxNRDVGaW5nZXJwcmludFZhbHVlLnNldEZvbnQobmV3IEZvbnQobnVsbCwgRm9udC5QTEFJTiwgMTEpKTsKKyAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzIGdiY19qbE1ENUZpbmdlcnByaW50VmFsdWUgPSAoR3JpZEJhZ0NvbnN0cmFpbnRzKSBnYmNWYWx1ZS5jbG9uZSgpOworICAgICAgICBnYmNfamxNRDVGaW5nZXJwcmludFZhbHVlLmdyaWR5ID0gMTc7CisgICAgICAgIAorICAgICAgICAvLyBFbXB0eSBsYWJlbCB0byBhZGQgYSBiaXQgc3BhY2UgYXQgdGhlIGJvdHRvbSBvZiB0aGUgcGFuZWwKKyAgICAgICAgLy8gdG8gbWFrZSBpdCBsb29rIGxpa2UgZmlyZWZveCdzIHZpZXcgY2VydGlmaWNhdGUgZGlhbG9nCisgICAgICAgIEpMYWJlbCBqbEVtcHR5ID0gbmV3IEpMYWJlbCgiIik7CisgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cyBnYmNfamxFbXB0eSA9IChHcmlkQmFnQ29uc3RyYWludHMpIGdiY0xhYmVsLmNsb25lKCk7CisgICAgICAgIGdiY19qbEVtcHR5LmdyaWR5ID0gMTg7CisgICAgICAgIGdiY19qbEVtcHR5LmdyaWR3aWR0aCA9IDI7IC8vdGFrZXMgdHdvIGNvbHVtbnMKKyAgICAgICAgZ2JjX2psRW1wdHkuaXBhZHkgPSA0MDsKKworICAgICAgICBKUGFuZWwganBDZXJ0aWZpY2F0ZSA9IG5ldyBKUGFuZWwobmV3IEdyaWRCYWdMYXlvdXQoKSk7CisgICAgICAgIGpwQ2VydGlmaWNhdGUuc2V0Qm9yZGVyKG5ldyBDb21wb3VuZEJvcmRlcigKKyAgICAgICAgICAgIG5ldyBFbXB0eUJvcmRlcigxNSwgMTUsIDE1LCAxNSksIG5ldyBFdGNoZWRCb3JkZXIoKSkpOworCisgICAgICAgIGlmIChpbnRlbmRlZFVzZXMgIT0gbnVsbCl7CisgICAgICAgIAlqcENlcnRpZmljYXRlLmFkZChqcFVzZXMsIGdiY19qcFVzZXMpOworICAgICAgICB9CisgICAgICAgIGpwQ2VydGlmaWNhdGUuYWRkKGpsSXNzdWVkVG8sIGdiY19qbElzc3VlZFRvKTsgLy8gSXNzdWVkIFRvCisgICAgICAgIGpwQ2VydGlmaWNhdGUuYWRkKGpsQ04sIGdiY19qbENOKTsKKyAgICAgICAganBDZXJ0aWZpY2F0ZS5hZGQoamxDTlZhbHVlLCBnYmNfamxDTlZhbHVlKTsKKyAgICAgICAganBDZXJ0aWZpY2F0ZS5hZGQoamxPcmcsIGdiY19qbE9yZyk7CisgICAgICAgIGpwQ2VydGlmaWNhdGUuYWRkKGpsT3JnVmFsdWUsIGdiY19qbE9yZ1ZhbHVlKTsgICAgICAgIAorICAgICAgICBqcENlcnRpZmljYXRlLmFkZChqbE9VLCBnYmNfamxPVSk7CisgICAgICAgIGpwQ2VydGlmaWNhdGUuYWRkKGpsT1VWYWx1ZSwgZ2JjX2psT1VWYWx1ZSk7CisgICAgICAgIC8vanBDZXJ0aWZpY2F0ZS5hZGQoamxFbWFpbCwgZ2JjX2psRW1haWwpOworICAgICAgICAvL2pwQ2VydGlmaWNhdGUuYWRkKGpsRW1haWxWYWx1ZSwgZ2JjX2psRW1haWxWYWx1ZSk7CisgICAgICAgIGpwQ2VydGlmaWNhdGUuYWRkKGpsU04sIGdiY19qbFNOKTsKKyAgICAgICAganBDZXJ0aWZpY2F0ZS5hZGQoamxTTlZhbHVlLCBnYmNfamxTTlZhbHVlKTsKKyAgICAgICAganBDZXJ0aWZpY2F0ZS5hZGQoamxWZXJzaW9uLCBnYmNfamxWZXJzaW9uKTsKKyAgICAgICAganBDZXJ0aWZpY2F0ZS5hZGQoamxWZXJzaW9uVmFsdWUsIGdiY19qbFZlcnNpb25WYWx1ZSk7CisgICAgICAgIGpwQ2VydGlmaWNhdGUuYWRkKGpsSXNzdWVkQnksIGdiY19qbElzc3VlZEJ5KTsgLy9Jc3N1ZWQgQnkKKyAgICAgICAganBDZXJ0aWZpY2F0ZS5hZGQoamxJQ04sIGdiY19qbElDTik7CisgICAgICAgIGpwQ2VydGlmaWNhdGUuYWRkKGpsSUNOVmFsdWUsIGdiY19qbElDTlZhbHVlKTsKKyAgICAgICAganBDZXJ0aWZpY2F0ZS5hZGQoamxJT3JnLCBnYmNfamxJT3JnKTsKKyAgICAgICAganBDZXJ0aWZpY2F0ZS5hZGQoamxJT3JnVmFsdWUsIGdiY19qbElPcmdWYWx1ZSk7ICAgICAgICAKKyAgICAgICAganBDZXJ0aWZpY2F0ZS5hZGQoamxJT1UsIGdiY19qbElPVSk7CisgICAgICAgIGpwQ2VydGlmaWNhdGUuYWRkKGpsSU9VVmFsdWUsIGdiY19qbElPVVZhbHVlKTsKKyAgICAgICAganBDZXJ0aWZpY2F0ZS5hZGQoamxWYWxpZGl0eSwgZ2JjX2psVmFsaWRpdHkpOyAvL1ZhbGlkaXR5CisgICAgICAgIGpwQ2VydGlmaWNhdGUuYWRkKGpsSXNzdWVkT24sIGdiY19qbElzc3VlZE9uKTsKKyAgICAgICAganBDZXJ0aWZpY2F0ZS5hZGQoamxJc3N1ZWRPblZhbHVlLCBnYmNfamxJc3N1ZWRPblZhbHVlKTsKKyAgICAgICAganBDZXJ0aWZpY2F0ZS5hZGQoamxFeHBpcmVzT24sIGdiY19qbEV4cGlyZXNPbik7CisgICAgICAgIGpwQ2VydGlmaWNhdGUuYWRkKGpsRXhwaXJlc09uVmFsdWUsIGdiY19qbEV4cGlyZXNPblZhbHVlKTsgCisgICAgICAgIGpwQ2VydGlmaWNhdGUuYWRkKGpsRmluZ2VycHJpbnRzLCBnYmNfamxGaW5nZXJwcmludHMpOyAvL0ZpbmdlcnByaW50cworICAgICAgICBqcENlcnRpZmljYXRlLmFkZChqbFNIQTFGaW5nZXJwcmludCwgZ2JjX2psU0hBMUZpbmdlcnByaW50KTsKKyAgICAgICAganBDZXJ0aWZpY2F0ZS5hZGQoamxTSEExRmluZ2VycHJpbnRWYWx1ZSwgZ2JjX2psU0hBMUZpbmdlcnByaW50VmFsdWUpOworICAgICAgICBqcENlcnRpZmljYXRlLmFkZChqbE1ENUZpbmdlcnByaW50LCBnYmNfamxNRDVGaW5nZXJwcmludCk7CisgICAgICAgIGpwQ2VydGlmaWNhdGUuYWRkKGpsTUQ1RmluZ2VycHJpbnRWYWx1ZSwgZ2JjX2psTUQ1RmluZ2VycHJpbnRWYWx1ZSk7CisgICAgICAgIGpwQ2VydGlmaWNhdGUuYWRkKGpsRW1wdHksIGdiY19qbEVtcHR5KTsgLy9FbXB0eSBsYWJlbCB0byBnZXQgc29tZSB2ZXJ0aWNhbCBzcGFjZSBvbiB0aGUgZnJhbWUKKworICAgICAgICAvLyBMaXN0IG9mIEF1dGhOIGFuZCBEb3JpYW4gVVJMcworICAgICAgICBKUGFuZWwganBBdXRoTkRvcmlhblVSTHMgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7CisgICAgICAgIGpwQXV0aE5Eb3JpYW5VUkxzLnNldEJvcmRlcihuZXcgQ29tcG91bmRCb3JkZXIoCisgICAgICAgICAgICAgICAgICAgIG5ldyBFbXB0eUJvcmRlcigwLCAxNSwgMCwgMTUpLCBuZXcgRXRjaGVkQm9yZGVyKCkpKTsKKyAgICAgICAgLy8gTGFiZWwKKyAgICAgICAgSkxhYmVsIGpsU2VydmljZVVSTHMgPSBuZXcgSkxhYmVsICgiVGhlIHByb3h5IGhhcyBiZWVuIG9idGFpbmVkIHVzaW5nOiIpOworICAgICAgICBqbFNlcnZpY2VVUkxzLnNldEZvbnQobmV3IEZvbnQobnVsbCwgRm9udC5CT0xELCAxMSkpOworICAgICAgICBqbFNlcnZpY2VVUkxzLnNldEJvcmRlcihuZXcgRW1wdHlCb3JkZXIoNSw1LDUsNSkpOyAgICAKKyAgCisgICAgCUpQYW5lbCBqcFVSTHMgPSBuZXcgSlBhbmVsKCk7CisgICAgCWpwVVJMcy5zZXRMYXlvdXQobmV3IEJveExheW91dChqcFVSTHMsIEJveExheW91dC5ZX0FYSVMpKTsKKyAgICAgICAgSkxhYmVsIGpsQXV0aE5TZXJ2aWNlVVJMID0gbmV3IEpMYWJlbCgiQXV0aGVudGljYXRpb24gU2VydmljZSIpOworICAgICAgICBqbEF1dGhOU2VydmljZVVSTC5zZXRGb250KG5ldyBGb250KG51bGwsIEZvbnQuUExBSU4sIDExKSk7CisgICAgICAgIGpsQXV0aE5TZXJ2aWNlVVJMLnNldEFsaWdubWVudFgoQ29tcG9uZW50LkxFRlRfQUxJR05NRU5UKTsKKyAgICAgICAgamxBdXRoTlNlcnZpY2VVUkwuc2V0Qm9yZGVyKG5ldyBFbXB0eUJvcmRlcig1LDUsMCw1KSk7ICAgIAorCisgICAgICAgIEpMYWJlbCBqbERvcmlhblNlcnZpY2VVUkwgPSBuZXcgSkxhYmVsKCJEb3JpYW4gU2VydmljZSIpOworICAgICAgICBqbERvcmlhblNlcnZpY2VVUkwuc2V0Rm9udChuZXcgRm9udChudWxsLCBGb250LlBMQUlOLCAxMSkpOworICAgICAgICBqbERvcmlhblNlcnZpY2VVUkwuc2V0QWxpZ25tZW50WChDb21wb25lbnQuTEVGVF9BTElHTk1FTlQpOworICAgICAgICBqbERvcmlhblNlcnZpY2VVUkwuc2V0Qm9yZGVyKG5ldyBFbXB0eUJvcmRlcig1LDUsMCw1KSk7ICAgIAorCisgICAgICAgIEpUZXh0RmllbGQganRmQXV0aE5TZXJ2aWNlVVJMID0gbmV3IEpUZXh0RmllbGQoMjUpOworICAgICAgICBqdGZBdXRoTlNlcnZpY2VVUkwuc2V0RWRpdGFibGUoZmFsc2UpOworICAgICAgICBqdGZBdXRoTlNlcnZpY2VVUkwuc2V0VGV4dChhdXRoTlNlcnZpY2VVUkwpOworICAgICAgICBqdGZBdXRoTlNlcnZpY2VVUkwuc2V0Rm9udChuZXcgRm9udChudWxsLCBGb250LlBMQUlOLCAxMSkpOworICAgICAgICBqdGZBdXRoTlNlcnZpY2VVUkwuc2V0QWxpZ25tZW50WChDb21wb25lbnQuTEVGVF9BTElHTk1FTlQpOworCisgICAgICAgIEpUZXh0RmllbGQganRmRG9yaWFuU2VydmljZVVSTCA9IG5ldyBKVGV4dEZpZWxkKDI1KTsKKyAgICAgICAganRmRG9yaWFuU2VydmljZVVSTC5zZXRFZGl0YWJsZShmYWxzZSk7CisgICAgICAgIGp0ZkRvcmlhblNlcnZpY2VVUkwuc2V0VGV4dChkb3JpYW5TZXJ2aWNlVVJMKTsKKyAgICAgICAganRmRG9yaWFuU2VydmljZVVSTC5zZXRGb250KG5ldyBGb250KG51bGwsIEZvbnQuUExBSU4sIDExKSk7CisgICAgICAgIGp0ZkRvcmlhblNlcnZpY2VVUkwuc2V0QWxpZ25tZW50WChDb21wb25lbnQuTEVGVF9BTElHTk1FTlQpOworCisgICAgICAgIGpwVVJMcy5hZGQoamxBdXRoTlNlcnZpY2VVUkwpOworICAgICAgICBqcFVSTHMuYWRkKGp0ZkF1dGhOU2VydmljZVVSTCk7CisgICAgICAgIGpwVVJMcy5hZGQoamxEb3JpYW5TZXJ2aWNlVVJMKTsKKyAgICAgICAganBVUkxzLmFkZChqdGZEb3JpYW5TZXJ2aWNlVVJMKTsKKworICAgICAgICBqcEF1dGhORG9yaWFuVVJMcy5hZGQoamxTZXJ2aWNlVVJMcywgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKKyAgICAgICAganBBdXRoTkRvcmlhblVSTHMuYWRkKGpwVVJMcywgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisgICAgICAgICAgICAgICAKKyAgICAgICAgLy8gT0sgYnV0dG9uCisgICAgICAgIEpQYW5lbCBqcE9LID0gbmV3IEpQYW5lbChuZXcgRmxvd0xheW91dChGbG93TGF5b3V0LkNFTlRFUikpOworCisgICAgICAgIGZpbmFsIEpCdXR0b24gamJPSyA9IG5ldyBKQnV0dG9uKCJPSyIpOworICAgICAgICBqYk9LLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb2tQcmVzc2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIGpwT0suYWRkKGpiT0spOworICAgICAgICAgCisgICAgICAgIC8vIFB1dCBpdCBhbGwgdG9nZXRoZXIgKHBhbmVsIHdpdGggVVJMIGxpc3QgaXMgYWxyZWFkeSBhZGRlZCwgaWYgaXQgd2FzIG5vdCBudWxsKQorICAgICAgICBnZXRDb250ZW50UGFuZSgpLmFkZChqcENlcnRpZmljYXRlLCBCb3JkZXJMYXlvdXQuTk9SVEgpOworICAgICAgICBnZXRDb250ZW50UGFuZSgpLmFkZChqcEF1dGhORG9yaWFuVVJMcywgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisgICAgICAgIGdldENvbnRlbnRQYW5lKCkuYWRkKGpwT0ssIEJvcmRlckxheW91dC5TT1VUSCk7CisKKyAgICAgICAgLy8gUmVzaXppbmcgd3JlYWtzIGhhdm9jCisgICAgICAgIHNldFJlc2l6YWJsZShmYWxzZSk7CisKKyAgICAgICAgYWRkV2luZG93TGlzdGVuZXIobmV3IFdpbmRvd0FkYXB0ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aW5kb3dDbG9zaW5nKFdpbmRvd0V2ZW50IGV2dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbG9zZURpYWxvZygpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBnZXRSb290UGFuZSgpLnNldERlZmF1bHRCdXR0b24oamJPSyk7CisKKyAgICAgICAgcGFjaygpOworCisgICAgICAgIFN3aW5nVXRpbGl0aWVzLmludm9rZUxhdGVyKG5ldyBSdW5uYWJsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgamJPSy5yZXF1ZXN0Rm9jdXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldCB0aGUgZGlnZXN0IG9mIGEgbWVzc2FnZSBhcyBhIGZvcm1hdHRlZCBTdHJpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYk1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gZGlnZXN0CisgICAgICogQHBhcmFtIGRpZ2VzdFR5cGUgVGhlIG1lc3NhZ2UgZGlnZXN0IGFsZ29yaXRobQorICAgICAqIEByZXR1cm4gVGhlIG1lc3NhZ2UgZGlnZXN0CisgICAgICogQHRocm93cyBDTUV4Y2VwdGlvbiBJZiB0aGVyZSB3YXMgYSBwcm9ibGVtIGdlbmVyYXRpbmcgdGhlIG1lc3NhZ2UKKyAgICAgKiBkaWdlc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlRGlnZXN0KGJ5dGVbXSBiTWVzc2FnZSwKKyAgICAgICAgU3RyaW5nIGRpZ2VzdFR5cGUpCisgICAgICAgIHRocm93cyBDTUV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgLy8gQ3JlYXRlIG1lc3NhZ2UgZGlnZXN0IG9iamVjdCB1c2luZyB0aGUgc3VwcGxpZWQgYWxnb3JpdGhtCisgICAgICAgIE1lc3NhZ2VEaWdlc3QgbWVzc2FnZURpZ2VzdDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1lc3NhZ2VEaWdlc3QgPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKGRpZ2VzdFR5cGUpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDTUV4Y2VwdGlvbigiRmFpbGVkIHRvIGNyZWF0ZSBtZXNzYWdlIGRpZ2VzdC4iLCBleCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgcmF3IG1lc3NhZ2UgZGlnZXN0CisgICAgICAgIGJ5dGVbXSBiRmluZ2VyUHJpbnQgPSBtZXNzYWdlRGlnZXN0LmRpZ2VzdChiTWVzc2FnZSk7CisKKyAgICAgICAgLy8gUGxhY2UgdGhlIHJhdyBtZXNzYWdlIGRpZ2VzdCBpbnRvIGEgU3RyaW5nQnVmZmVyIGFzIGEgSGV4IG51bWJlcgorICAgICAgICBTdHJpbmdCdWZmZXIgc3RyQnVmZiA9IG5ldyBTdHJpbmdCdWZmZXIoCisgICAgICAgICAgICBuZXcgQmlnSW50ZWdlcigxLCBiRmluZ2VyUHJpbnQpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpKTsKKworICAgICAgICAvLyBPZGQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgc28gYWRkIGluIGEgcGFkZGluZyAiMCIKKyAgICAgICAgaWYgKChzdHJCdWZmLmxlbmd0aCgpICUgMikgIT0gMCkgeworICAgICAgICAgICAgc3RyQnVmZi5pbnNlcnQoMCwgJzAnKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBsYWNlIGNvbG9ucyBhdCBldmVyeSB0d28gaGV4IGNoYXJhY3RlcnMKKyAgICAgICAgaWYgKHN0ckJ1ZmYubGVuZ3RoKCkgPiAyKSB7CisgICAgICAgICAgICBmb3IgKGludCBpQ250ID0gMjsgaUNudCA8IHN0ckJ1ZmYubGVuZ3RoKCk7IGlDbnQgKz0gMykgeworICAgICAgICAgICAgICAgIHN0ckJ1ZmYuaW5zZXJ0KGlDbnQsICc6Jyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXR1cm4gdGhlIGZvcm1hdHRlZCBtZXNzYWdlIGRpZ2VzdAorICAgICAgICByZXR1cm4gc3RyQnVmZi50b1N0cmluZygpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBpbnRlbmRlZCBjZXJ0aWZpY2F0ZSB1c2VzLCBpLmUuIE5ldHNjYXBlIENlcnRpZmljYXRlIFR5cGUgZXh0ZW5zaW9uICgyLjE2Ljg0MC4xLjExMzczMC4xLjEpIAorICAgICAqIHZhbHVlIGFzIGEgc3RyaW5nCisgICAgICogQHBhcmFtIHZhbHVlIEV4dGVuc2lvbiB2YWx1ZSBhcyBhIERFUi1lbmNvZGVkIE9DVEVUIHN0cmluZworICAgICAqIEByZXR1cm4gRXh0ZW5zaW9uIHZhbHVlIGFzIGEgc3RyaW5nCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0SW50ZW5kZWRVc2VzKGJ5dGVbXSB2YWx1ZSkKKyAgICB7CisgICAgCQorICAgICAgICAvLyBOZXRzY2FwZSBDZXJ0aWZpY2F0ZSBUeXBlcyAoMi4xNi44NDAuMS4xMTM3MzAuMS4xKQorICAgICAgICBpbnRbXSBJTlRFTkRFRF9VU0VTID0gbmV3IGludFtdIHsKKyAgICAgICAgICAgIE5ldHNjYXBlQ2VydFR5cGUuc3NsQ2xpZW50LAorICAgICAgICAgICAgTmV0c2NhcGVDZXJ0VHlwZS5zc2xTZXJ2ZXIsCisgICAgICAgICAgICBOZXRzY2FwZUNlcnRUeXBlLnNtaW1lLAorICAgICAgICAgICAgTmV0c2NhcGVDZXJ0VHlwZS5vYmplY3RTaWduaW5nLAorICAgICAgICAgICAgTmV0c2NhcGVDZXJ0VHlwZS5yZXNlcnZlZCwKKyAgICAgICAgICAgIE5ldHNjYXBlQ2VydFR5cGUuc3NsQ0EsCisgICAgICAgICAgICBOZXRzY2FwZUNlcnRUeXBlLnNtaW1lQ0EsCisgICAgICAgICAgICBOZXRzY2FwZUNlcnRUeXBlLm9iamVjdFNpZ25pbmdDQSwKKyAgICAgICAgfTsKKyAgICAgICAgCisgICAgICAgIC8vIE5ldHNjYXBlIENlcnRpZmljYXRlIFR5cGUgc3RyaW5ncyAoMi4xNi44NDAuMS4xMTM3MzAuMS4xKQorICAgICAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBJTlRFTkRFRF9VU0VTX1NUUklOR1MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gKCk7CisgICAgICAgIElOVEVOREVEX1VTRVNfU1RSSU5HUy5wdXQoIjEyOCIsICJTU0wgQ2xpZW50Iik7CisgICAgICAgIElOVEVOREVEX1VTRVNfU1RSSU5HUy5wdXQoIjY0IiwgIlNTTCBTZXJ2ZXIiKTsKKyAgICAgICAgSU5URU5ERURfVVNFU19TVFJJTkdTLnB1dCgiMzIiLCAiUy9NSU1FIik7CisgICAgICAgIElOVEVOREVEX1VTRVNfU1RSSU5HUy5wdXQoIjE2IiwgIk9iamVjdCBTaWduaW5nIik7CisgICAgICAgIElOVEVOREVEX1VTRVNfU1RSSU5HUy5wdXQoIjgiLCAiUmVzZXJ2ZWQiKTsKKyAgICAgICAgSU5URU5ERURfVVNFU19TVFJJTkdTLnB1dCgiNCIsICJTU0wgQ0EiKTsKKyAgICAgICAgSU5URU5ERURfVVNFU19TVFJJTkdTLnB1dCgiMiIsICJTL01JTUUgQ0EiKTsKKyAgICAgICAgSU5URU5ERURfVVNFU19TVFJJTkdTLnB1dCgiMSIsICJPYmplY3QgU2lnbmluZyBDQSIpOworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIC8vIEdldCBvY3RldCBzdHJpbmcgZnJvbSBleHRlbnNpb24gdmFsdWUKKyAgICAgICAgQVNOMU9jdGV0U3RyaW5nIGZyb21CeXRlQXJyYXkgPSBuZXcgREVST2N0ZXRTdHJpbmcodmFsdWUpOworCQlieXRlW10gb2N0ZXRzID0gZnJvbUJ5dGVBcnJheS5nZXRPY3RldHMoKTsgICAgICAgICAgICAKKyAgICAJREVSQml0U3RyaW5nIGZyb21CeXRlQXJyYXkyID0gbmV3IERFUkJpdFN0cmluZyhvY3RldHMpOworCQlpbnQgdmFsID0gbmV3IE5ldHNjYXBlQ2VydFR5cGUoZnJvbUJ5dGVBcnJheTIpLmludFZhbHVlKCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzdHJCdWZmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBmb3IgKGludCBpID0gMCwgbGVuID0gSU5URU5ERURfVVNFUy5sZW5ndGg7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgaW50IHVzZSA9IElOVEVOREVEX1VTRVNbaV07CisgICAgICAgICAgICBpZiAoKHZhbCAmIHVzZSkgPT0gdXNlKSB7CisgICAgICAgICAgICAgICAgc3RyQnVmZi5hcHBlbmQoSU5URU5ERURfVVNFU19TVFJJTkdTLmdldChTdHJpbmcudmFsdWVPZih1c2UpKSsiLCBcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIHJlbW92ZSB0aGUgbGFzdCAiLCBcbiIgZnJvbSB0aGUgZW5kIG9mIHRoZSBidWZmZXIKKyAgICAgICAgU3RyaW5nIHN0ciA9IHN0ckJ1ZmYudG9TdHJpbmcoKTsKKyAgICAgICAgc3RyID0gc3RyLnN1YnN0cmluZygwLCBzdHIubGVuZ3RoKCktMyk7CisgICAgICAgIHJldHVybiBzdHI7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIE9LIGJ1dHRvbiBwcmVzc2VkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBva1ByZXNzZWQoKQorICAgIHsKKyAgICAgICAgY2xvc2VEaWFsb2coKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIFZpZXcgQ2VydGlmaWNhdGUgRW50cnkgZGlhbG9nLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjbG9zZURpYWxvZygpCisgICAgeworICAgICAgICBzZXRWaXNpYmxlKGZhbHNlKTsKKyAgICAgICAgZGlzcG9zZSgpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9uZXQvc2YvdGF2ZXJuYS90Mi93b3JrYmVuY2gvdWkvY3JlZGVudGlhbG1hbmFnZXIvVmlld0NlcnREZXRhaWxzRGlhbG9nLmphdmEgYi9zcmMvbWFpbi9qYXZhL25ldC9zZi90YXZlcm5hL3QyL3dvcmtiZW5jaC91aS9jcmVkZW50aWFsbWFuYWdlci9WaWV3Q2VydERldGFpbHNEaWFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjIwODk4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9uZXQvc2YvdGF2ZXJuYS90Mi93b3JrYmVuY2gvdWkvY3JlZGVudGlhbG1hbmFnZXIvVmlld0NlcnREZXRhaWxzRGlhbG9nLmphdmEKQEAgLTAsMCArMSw1OTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIFVuaXZlcnNpdHkgb2YgTWFuY2hlc3RlciAgIAorICogCisgKiAgTW9kaWZpY2F0aW9ucyB0byB0aGUgaW5pdGlhbCBjb2RlIGJhc2UgYXJlIGNvcHlyaWdodCBvZiB0aGVpcgorICogIHJlc3BlY3RpdmUgYXV0aG9ycywgb3IgdGhlaXIgZW1wbG95ZXJzIGFzIGFwcHJvcHJpYXRlLgorICogCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAgIAorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogICAgCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBuZXQuc2YudGF2ZXJuYS50Mi53b3JrYmVuY2gudWkuY3JlZGVudGlhbG1hbmFnZXI7CisKK2ltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7CitpbXBvcnQgamF2YS5hd3QuRmxvd0xheW91dDsKK2ltcG9ydCBqYXZhLmF3dC5HcmlkQmFnQ29uc3RyYWludHM7CitpbXBvcnQgamF2YS5hd3QuR3JpZEJhZ0xheW91dDsKK2ltcG9ydCBqYXZhLmF3dC5JbnNldHM7CitpbXBvcnQgamF2YS5hd3QuRm9udDsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dBZGFwdGVyOworaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50OworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCitpbXBvcnQgamF2YXguc3dpbmcuRGVmYXVsdExpc3RNb2RlbDsKK2ltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOworaW1wb3J0IGphdmF4LnN3aW5nLkpEaWFsb2c7CitpbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOworaW1wb3J0IGphdmF4LnN3aW5nLkpMYWJlbDsKK2ltcG9ydCBqYXZheC5zd2luZy5KTGlzdDsKK2ltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7CitpbXBvcnQgamF2YXguc3dpbmcuSlNjcm9sbFBhbmU7CitpbXBvcnQgamF2YXguc3dpbmcuSlRleHRGaWVsZDsKK2ltcG9ydCBqYXZheC5zd2luZy5Td2luZ1V0aWxpdGllczsKK2ltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuQ29tcG91bmRCb3JkZXI7CitpbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkVtcHR5Qm9yZGVyOworaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5FdGNoZWRCb3JkZXI7CitpbXBvcnQgamF2YXguc3dpbmcuSlNlcGFyYXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZTsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbDsKKworaW1wb3J0IG5ldC5zZi50YXZlcm5hLnQyLnNlY3VyaXR5LmNyZWRlbnRpYWxtYW5hZ2VyLkNNRXhjZXB0aW9uOworaW1wb3J0IG5ldC5zZi50YXZlcm5hLnQyLnNlY3VyaXR5LmNyZWRlbnRpYWxtYW5hZ2VyLkNNWDUwOVV0aWw7CisKKy8vaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOworaW1wb3J0IG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xT2N0ZXRTdHJpbmc7CitpbXBvcnQgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkJpdFN0cmluZzsKK2ltcG9ydCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2N0ZXRTdHJpbmc7CitpbXBvcnQgb3JnLmJvdW5jeWNhc3RsZS5hc24xLm1pc2MuTmV0c2NhcGVDZXJ0VHlwZTsKKworCisvKioKKyAqIERpc3BsYXlzIHRoZSBkZXRhaWxzIG9mIGEgWC41MDkgY2VydGlmaWNhdGUuCisgKiAKKyAqIEBhdXRob3IgQWxleCBOZW5hZGljCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQorcHVibGljIGNsYXNzIFZpZXdDZXJ0RGV0YWlsc0RpYWxvZworICAgIGV4dGVuZHMgSkRpYWxvZworeyAJCisJLy8gTG9nZ2VyCisJLy9wcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihWaWV3Q2VydERldGFpbHNEaWFsb2cuY2xhc3MpOworCQorCS8vIFN0b3JlcyBjZXJ0aWZpY2F0ZSB0byBkaXNwbGF5IAorICAgIHByaXZhdGUgWDUwOUNlcnRpZmljYXRlIGNlcnQ7CisgICAgCisgICAgLy8gU3RvcmVzIGxpc3Qgb2Ygc2VydmljZVVSTHMgdG8gZGlzcGxheSAKKyAgICBwcml2YXRlICBBcnJheUxpc3Q8U3RyaW5nPiBzZXJ2aWNlVVJMczsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgbmV3IFZpZXdDZXJ0RGV0YWlsc0RpYWxvZyBkaWFsb2cgd2hlcmUgdGhlIHBhcmVudCBpcyBhIGZyYW1lLgorICAgICAqLworICAgIHB1YmxpYyBWaWV3Q2VydERldGFpbHNEaWFsb2coSkZyYW1lIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBib29sZWFuIG1vZGFsLAorICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY3J0LCBBcnJheUxpc3Q8U3RyaW5nPiBzZXJ2aWNlVVJMcykKKyAgICAgICAgdGhyb3dzIENNRXhjZXB0aW9uCisgICAgeworICAgICAgICBzdXBlcihwYXJlbnQsIHRpdGxlLCBtb2RhbCk7CisgICAgICAgIHRoaXMuY2VydCA9IGNydDsKKyAgICAgICAgdGhpcy5zZXJ2aWNlVVJMcyA9IHNlcnZpY2VVUkxzOworICAgICAgICBpbml0Q29tcG9uZW50cygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgbmV3IFZpZXdDZXJ0RGV0YWlsc0RpYWxvZyBkaWFsb2cgd2hlcmUgdGhlIHBhcmVudCBpcyBhIGRpYWxvZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmlld0NlcnREZXRhaWxzRGlhbG9nKEpEaWFsb2cgcGFyZW50LCBTdHJpbmcgdGl0bGUsIGJvb2xlYW4gbW9kYWwsCisgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjcnQsIEFycmF5TGlzdDxTdHJpbmc+IHVybExpc3QpCisgICAgICAgIHRocm93cyBDTUV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgc3VwZXIocGFyZW50LCB0aXRsZSwgbW9kYWwpOworICAgICAgICBjZXJ0ID0gY3J0OworICAgICAgICBzZXJ2aWNlVVJMcyA9IHVybExpc3Q7CisgICAgICAgIGluaXRDb21wb25lbnRzKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEluaXRpYWxpc2UgdGhlIGRpYWxvZydzIEdVSSBjb21wb25lbnRzLgorICAgICAqCisgICAgICogQHRocm93cyBDTUV4Y2VwdGlvbiBBIHByb2JsZW0gd2FzIGVuY291bnRlcmVkIGdldHRpbmcgdGhlCisgICAgICogY2VydGlmaWNhdGVzJyBkZXRhaWxzCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluaXRDb21wb25lbnRzKCkKKyAgICAgICAgdGhyb3dzIENNRXhjZXB0aW9uCisgICAgeworCisgICAgICAgIC8vIENlcnRpZmljYXRlIGRldGFpbHM6CisKKyAgICAgICAgLy8gR3JpZCBCYWcgQ29uc3RyYWludHMgdGVtcGxhdGVzIGZvciBsYWJlbHMgKGNvbHVtbiAxKSBhbmQgCisgICAgCS8vIHZhbHVlcyAoY29sdW1uIDIpIG9mIGNlcnRpZmljYXRlIGRldGFpbHMKKyAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzIGdiY0xhYmVsID0gbmV3IEdyaWRCYWdDb25zdHJhaW50cygpOworICAgICAgICBnYmNMYWJlbC5ncmlkeCA9IDA7CisgICAgICAgIGdiY0xhYmVsLmlwYWR4ID0gMjA7CisgICAgICAgIGdiY0xhYmVsLmdyaWR3aWR0aCA9IDE7CisgICAgICAgIGdiY0xhYmVsLmdyaWRoZWlnaHQgPSAxOworICAgICAgICBnYmNMYWJlbC5pbnNldHMgPSBuZXcgSW5zZXRzKDIsIDE1LCAyLCAyKTsKKyAgICAgICAgZ2JjTGFiZWwuYW5jaG9yID0gR3JpZEJhZ0NvbnN0cmFpbnRzLkxJTkVfU1RBUlQ7CisKKyAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzIGdiY1ZhbHVlID0gbmV3IEdyaWRCYWdDb25zdHJhaW50cygpOworICAgICAgICBnYmNWYWx1ZS5ncmlkeCA9IDE7CisgICAgICAgIGdiY1ZhbHVlLmdyaWR3aWR0aCA9IDE7CisgICAgICAgIGdiY1ZhbHVlLmdyaWRoZWlnaHQgPSAxOworICAgICAgICBnYmNWYWx1ZS5pbnNldHMgPSBuZXcgSW5zZXRzKDIsIDUsIDIsIDIpOworICAgICAgICBnYmNWYWx1ZS5hbmNob3IgPSBHcmlkQmFnQ29uc3RyYWludHMuTElORV9TVEFSVDsKKyAgICAgICAgCisgICAgICAgIC8vIE5ldHNjYXBlIENlcnRpZmljYXRlIFR5cGUgbm9uLWNyaXRpY2FsIGV4dGVuc2lvbiAoaWYgYW55KQorICAgICAgICAvLyBkZWZpbmVzIHRoZSBpbnRlbmRlZCB1c2VzIG9mIHRoZSBjZXJ0aWZpY2F0ZSAtIHRvIG1ha2UgaXQgbG9vayBsaWtlIAorICAgICAgICAvLyBmaXJlZm94J3MgdmlldyBjZXJ0aWZpY2F0ZSBkaWFsb2cKKyAgICAgICAgYnl0ZVtdIGludGVuZGVkVXNlcyA9IGNlcnQuZ2V0RXh0ZW5zaW9uVmFsdWUoIjIuMTYuODQwLjEuMTEzNzMwLjEuMSIpOyAvL05ldHNjYXBlIENlcnRpZmljYXRlIFR5cGUgT0lELyoKKyAgICAgICAgSkxhYmVsIGpsSW50ZW5kZWRVc2VzID0gbnVsbDsKKyAgICAgICAgSlRleHRGaWVsZCBqdGZJbnRlbmRlZFVzZXNWYWx1ZSA9IG51bGw7CisgICAgICAgIEpQYW5lbCBqcFVzZXMgPSBudWxsOworICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMgZ2JjX2pwVXNlcyA9IG51bGw7CisgICAgICAgIGlmIChpbnRlbmRlZFVzZXMgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgCWpsSW50ZW5kZWRVc2VzID0gbmV3IEpMYWJlbCgiVGhpcyBjZXJ0aWZpY2F0ZSBoYXMgYmVlbiBhcHByb3ZlZCBmb3IgdGhlIGZvbGxvd2luZyB1c2VzOiIpOworICAgICAgICAgCWpsSW50ZW5kZWRVc2VzLnNldEZvbnQobmV3IEZvbnQobnVsbCwgRm9udC5CT0xELCAxMSkpOworICAgICAgICAgCWpsSW50ZW5kZWRVc2VzLnNldEJvcmRlcihuZXcgRW1wdHlCb3JkZXIoNSw1LDUsNSkpOworICAgICAgICAgCQorICAgICAgICAgCWp0ZkludGVuZGVkVXNlc1ZhbHVlID0gbmV3IEpUZXh0RmllbGQoNDUpOworICAgICAgICAgCWp0ZkludGVuZGVkVXNlc1ZhbHVlLnNldFRleHQoZ2V0SW50ZW5kZWRVc2VzKGludGVuZGVkVXNlcykpOworICAgICAgICAJanRmSW50ZW5kZWRVc2VzVmFsdWUuc2V0RWRpdGFibGUoZmFsc2UpOworICAgICAgICAJanRmSW50ZW5kZWRVc2VzVmFsdWUuc2V0Rm9udChuZXcgRm9udChudWxsLCBGb250LlBMQUlOLCAxMSkpOworICAgICAgICAgICAgIAorICAgICAgICAJanBVc2VzID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOyAKKyAgICAgICAgCWpwVXNlcy5hZGQoamxJbnRlbmRlZFVzZXMsIEJvcmRlckxheW91dC5OT1JUSCk7CisgICAgICAgIAlqcFVzZXMuYWRkKGp0ZkludGVuZGVkVXNlc1ZhbHVlLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKyAgICAgICAgCUpTZXBhcmF0b3IganNwID0gbmV3IEpTZXBhcmF0b3IoSlNlcGFyYXRvci5IT1JJWk9OVEFMKTsKKyAgICAgICAgCWpwVXNlcy5hZGQoanNwLCBCb3JkZXJMYXlvdXQuU09VVEgpOworICAgICAgICAJCisgICAgICAgIAlnYmNfanBVc2VzID0gKEdyaWRCYWdDb25zdHJhaW50cykgZ2JjTGFiZWwuY2xvbmUoKTsKKyAgICAgICAgCWdiY19qcFVzZXMuZ3JpZHkgPSAwOworICAgICAgICAJZ2JjX2pwVXNlcy5ncmlkd2lkdGggPSAyOyAvL3Rha2VzIHR3byBjb2x1bW5zCisgICAgICAgIAlnYmNfanBVc2VzLmluc2V0cyA9IG5ldyBJbnNldHMoNSwgNSwgNSwgNSk7Ly9oYXMgc2xpZ2h0bHkgYmlnZ2VyIGluc2V0cworCisgICAgICAgIH0KKworICAgICAgICAvL0lzc3VlZCBUbworICAgICAgICBKTGFiZWwgamxJc3N1ZWRUbyA9IG5ldyBKTGFiZWwoIklzc3VlZCBUbyIpOworICAgICAgICBqbElzc3VlZFRvLnNldEZvbnQobmV3IEZvbnQobnVsbCwgRm9udC5CT0xELCAxMSkpOworICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMgZ2JjX2psSXNzdWVkVG8gPSAoR3JpZEJhZ0NvbnN0cmFpbnRzKSBnYmNMYWJlbC5jbG9uZSgpOworICAgICAgICBnYmNfamxJc3N1ZWRUby5ncmlkeSA9IDE7CisgICAgICAgIGdiY19qbElzc3VlZFRvLmdyaWR3aWR0aCA9IDI7IC8vdGFrZXMgdHdvIGNvbHVtbnMKKyAgICAgICAgZ2JjX2psSXNzdWVkVG8uaW5zZXRzID0gbmV3IEluc2V0cyg1LCA1LCA1LCA1KTsvL2hhcyBzbGlnaHRseSBiaWdnZXIgaW5zZXRzCisgICAgICAgIC8vIERpc3Rpbmd1aXNoZWQgTmFtZSAoRE4pCisJCVN0cmluZyBzRE4gPSBjZXJ0LmdldFN1YmplY3RYNTAwUHJpbmNpcGFsKCkuZ2V0TmFtZShYNTAwUHJpbmNpcGFsLlJGQzIyNTMpOworCQlDTVg1MDlVdGlsIHV0aWwgPSBuZXcgQ01YNTA5VXRpbCgpOworCQl1dGlsLnBhcnNlRE4oc0ROKTsgICAgICAgCisJCS8vIEV4dHJhY3QgdGhlIENOLCBPLCBPVSBhbmQgRU1BSUxBRERSRVNTIGZpZWxkcworICAgICAgICBTdHJpbmcgc0NOID0gdXRpbC5nZXRDTigpOworICAgICAgICBTdHJpbmcgc09yZyA9IHV0aWwuZ2V0TygpOworICAgICAgICBTdHJpbmcgc09VID0gdXRpbC5nZXRPVSgpOworICAgICAgICAvL1N0cmluZyBzRU1BSUxBRERSRVNTID0gQ01YNTA5VXRpbC5nZXRFbWlsQWRkcmVzcygpOworICAgICAgICAvLyBDb21tb24gTmFtZSAoQ04pCisgICAgICAgIEpMYWJlbCBqbENOID0gbmV3IEpMYWJlbCgiQ29tbW9uIE5hbWUgKENOKSIpOworICAgICAgICBqbENOLnNldEZvbnQobmV3IEZvbnQobnVsbCwgRm9udC5QTEFJTiwgMTEpKTsKKyAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzIGdiY19qbENOID0gKEdyaWRCYWdDb25zdHJhaW50cykgZ2JjTGFiZWwuY2xvbmUoKTsKKyAgICAgICAgZ2JjX2psQ04uZ3JpZHkgPSAyOworICAgICAgICBKTGFiZWwgamxDTlZhbHVlID0gbmV3IEpMYWJlbChzQ04pOworICAgICAgICBqbENOVmFsdWUuc2V0Rm9udChuZXcgRm9udChudWxsLCBGb250LlBMQUlOLCAxMSkpOworICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMgZ2JjX2psQ05WYWx1ZSA9IChHcmlkQmFnQ29uc3RyYWludHMpIGdiY1ZhbHVlLmNsb25lKCk7CisgICAgICAgIGdiY19qbENOVmFsdWUuZ3JpZHkgPSAyOworICAgICAgICAvLyBPcmdhbmlzYXRpb24gKE8pCisgICAgICAgIEpMYWJlbCBqbE9yZyA9IG5ldyBKTGFiZWwoIk9yZ2FuaXNhdGlvbiAoTykiKTsKKyAgICAgICAgamxPcmcuc2V0Rm9udChuZXcgRm9udChudWxsLCBGb250LlBMQUlOLCAxMSkpOworICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMgZ2JjX2psT3JnID0gKEdyaWRCYWdDb25zdHJhaW50cykgZ2JjTGFiZWwuY2xvbmUoKTsKKyAgICAgICAgZ2JjX2psT3JnLmdyaWR5ID0gMzsKKyAgICAgICAgSkxhYmVsIGpsT3JnVmFsdWUgPSBuZXcgSkxhYmVsKHNPcmcpOworICAgICAgICBqbE9yZ1ZhbHVlLnNldEZvbnQobmV3IEZvbnQobnVsbCwgRm9udC5QTEFJTiwgMTEpKTsKKyAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzIGdiY19qbE9yZ1ZhbHVlID0gKEdyaWRCYWdDb25zdHJhaW50cykgZ2JjVmFsdWUuY2xvbmUoKTsKKyAgICAgICAgZ2JjX2psT3JnVmFsdWUuZ3JpZHkgPSAzOworICAgICAgICAvLyBPcmdhbmlzYXRpb24gVW5pdCAoT1UpCisgICAgICAgIEpMYWJlbCBqbE9VID0gbmV3IEpMYWJlbCgiT3JnYW5pc2F0aW9uIFVuaXQgKE9VKSIpOworICAgICAgICBqbE9VLnNldEZvbnQobmV3IEZvbnQobnVsbCwgRm9udC5QTEFJTiwgMTEpKTsKKyAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzIGdiY19qbE9VID0gKEdyaWRCYWdDb25zdHJhaW50cykgZ2JjTGFiZWwuY2xvbmUoKTsKKyAgICAgICAgZ2JjX2psT1UuZ3JpZHkgPSA0OworICAgICAgICBKTGFiZWwgamxPVVZhbHVlID0gbmV3IEpMYWJlbChzT1UpOworICAgICAgICBqbE9VVmFsdWUuc2V0Rm9udChuZXcgRm9udChudWxsLCBGb250LlBMQUlOLCAxMSkpOworICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMgZ2JjX2psT1VWYWx1ZSA9IChHcmlkQmFnQ29uc3RyYWludHMpIGdiY1ZhbHVlLmNsb25lKCk7CisgICAgICAgIGdiY19qbE9VVmFsdWUuZ3JpZHkgPSA0OworICAgICAgICAvLyBFLW1haWwgQWRkcmVzcworICAgICAgICAvL0pMYWJlbCBqbEVtYWlsID0gbmV3IEpMYWJlbCgiRS1tYWlsIEFkZHJlc3MiKTsKKyAgICAgICAgLy9qbEVtYWlsLnNldEZvbnQobmV3IEZvbnQobnVsbCwgRm9udC5QTEFJTiwgMTEpKTsKKyAgICAgICAgLy9HcmlkQmFnQ29uc3RyYWludHMgZ2JjX2psRW1haWwgPSAoR3JpZEJhZ0NvbnN0cmFpbnRzKSBnYmNMYWJlbC5jbG9uZSgpOworICAgICAgICAvL2diY19qbEVtYWlsLmdyaWR5ID0gNTsKKyAgICAgICAgLy9KTGFiZWwgamxFbWFpbFZhbHVlID0gbmV3IEpMYWJlbChzRU1BSUxBRERSRVNTKTsKKyAgICAgICAgLy9qbEVtYWlsVmFsdWUuc2V0Rm9udChuZXcgRm9udChudWxsLCBGb250LlBMQUlOLCAxMSkpOworICAgICAgICAvL0dyaWRCYWdDb25zdHJhaW50cyBnYmNfamxFbWFpbFZhbHVlID0gKEdyaWRCYWdDb25zdHJhaW50cykgZ2JjVmFsdWUuY2xvbmUoKTsKKyAgICAgICAgLy9nYmNfamxFbWFpbFZhbHVlLmdyaWR5ID0gNTsKKyAgICAgICAgLy8gU2VyaWFsIE51bWJlcgorICAgICAgICBKTGFiZWwgamxTTiA9IG5ldyBKTGFiZWwoIlNlcmlhbCBOdW1iZXIiKTsKKyAgICAgICAgamxTTi5zZXRGb250KG5ldyBGb250KG51bGwsIEZvbnQuUExBSU4sIDExKSk7CisgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cyBnYmNfamxTTiA9IChHcmlkQmFnQ29uc3RyYWludHMpIGdiY0xhYmVsLmNsb25lKCk7CisgICAgICAgIGdiY19qbFNOLmdyaWR5ID0gNjsKKyAgICAgICAgSkxhYmVsIGpsU05WYWx1ZSA9IG5ldyBKTGFiZWwoKTsKKyAgICAgICAgLy8gR2V0IHRoZSBoZXhhZGVjaW1hbCBzZXJpYWwgbnVtYmVyCisgICAgICAgIFN0cmluZ0J1ZmZlciBzdHJCdWZmID0gbmV3IFN0cmluZ0J1ZmZlciAobmV3IEJpZ0ludGVnZXIoMSwKKyAgICAgICAgICAgICAgICBjZXJ0LmdldFNlcmlhbE51bWJlcigpLnRvQnl0ZUFycmF5KCkpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpKTsKKyAgICAgICAgLy8gUGxhY2UgY29sb25zIGF0IGV2ZXJ5IHR3byBoZXhhZGVjaW1hbCBjaGFyYWN0ZXJzCisgICAgICAgIGlmIChzdHJCdWZmLmxlbmd0aCgpID4gMikgeworICAgICAgICAgICAgZm9yIChpbnQgaUNudCA9IDI7IGlDbnQgPCBzdHJCdWZmLmxlbmd0aCgpOyBpQ250ICs9IDMpIHsKKyAgICAgICAgICAgICAgICBzdHJCdWZmLmluc2VydChpQ250LCAnOicpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGpsU05WYWx1ZS5zZXRUZXh0KHN0ckJ1ZmYudG9TdHJpbmcoKSk7CisgICAgICAgIGpsU05WYWx1ZS5zZXRGb250KG5ldyBGb250KG51bGwsIEZvbnQuUExBSU4sIDExKSk7CisgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cyBnYmNfamxTTlZhbHVlID0gKEdyaWRCYWdDb25zdHJhaW50cykgZ2JjVmFsdWUuY2xvbmUoKTsKKyAgICAgICAgZ2JjX2psU05WYWx1ZS5ncmlkeSA9IDY7CisgICAgICAgIC8vIFZlcnNpb24KKyAgICAgICAgSkxhYmVsIGpsVmVyc2lvbiA9IG5ldyBKTGFiZWwoIlZlcnNpb24iKTsKKyAgICAgICAgamxWZXJzaW9uLnNldEZvbnQobmV3IEZvbnQobnVsbCwgRm9udC5QTEFJTiwgMTEpKTsKKyAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzIGdiY19qbFZlcnNpb24gPSAoR3JpZEJhZ0NvbnN0cmFpbnRzKSBnYmNMYWJlbC5jbG9uZSgpOworICAgICAgICBnYmNfamxWZXJzaW9uLmdyaWR5ID0gNzsKKyAgICAgICAgSkxhYmVsIGpsVmVyc2lvblZhbHVlID0gbmV3IEpMYWJlbChJbnRlZ2VyLnRvU3RyaW5nKGNlcnQuZ2V0VmVyc2lvbigpKSk7CisgICAgICAgIGpsVmVyc2lvblZhbHVlLnNldEZvbnQobmV3IEZvbnQobnVsbCwgRm9udC5QTEFJTiwgMTEpKTsKKyAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzIGdiY19qbFZlcnNpb25WYWx1ZSA9IChHcmlkQmFnQ29uc3RyYWludHMpIGdiY1ZhbHVlLmNsb25lKCk7CisgICAgICAgIGdiY19qbFZlcnNpb25WYWx1ZS5ncmlkeSA9IDc7CisKKyAgICAgICAgLy8gSXNzdWVkIEJ5CisgICAgICAgIEpMYWJlbCBqbElzc3VlZEJ5ID0gbmV3IEpMYWJlbCgiSXNzdWVkIEJ5Iik7CisgICAgICAgIGpsSXNzdWVkQnkuc2V0Rm9udChuZXcgRm9udChudWxsLCBGb250LkJPTEQsIDExKSk7CisgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cyBnYmNfamxJc3N1ZWRCeSA9IChHcmlkQmFnQ29uc3RyYWludHMpIGdiY0xhYmVsLmNsb25lKCk7CisgICAgICAgIGdiY19qbElzc3VlZEJ5LmdyaWR5ID0gODsKKyAgICAgICAgZ2JjX2psSXNzdWVkQnkuZ3JpZHdpZHRoID0gMjsgLy90YWtlcyB0d28gY29sdW1ucyAKKyAgICAgICAgZ2JjX2psSXNzdWVkQnkuaW5zZXRzID0gbmV3IEluc2V0cyg1LCA1LCA1LCA1KTsvL2hhcyBzbGlnaHRseSBiaWdnZXIgaW5zZXRzICAgICAgICAKKyAgICAgICAgLy8gRGlzdGluZ3Vpc2hlZCBOYW1lIChETikgICAgICAgCisJCVN0cmluZyBpRE4gPSBjZXJ0LmdldElzc3Vlclg1MDBQcmluY2lwYWwoKS5nZXROYW1lKFg1MDBQcmluY2lwYWwuUkZDMjI1Myk7CisJCXV0aWwucGFyc2VETihpRE4pOyAgICAgICAgCisgICAgICAgIC8vIEV4dHJhY3QgdGhlIENOLCBPIGFuZCBPVSBmaWVsZHMKKyAgICAgICAgU3RyaW5nIGlDTiA9IHV0aWwuZ2V0Q04oKTsKKyAgICAgICAgU3RyaW5nIGlPcmcgPSB1dGlsLmdldE8oKTsKKyAgICAgICAgU3RyaW5nIGlPVSA9IHV0aWwuZ2V0T1UoKTsgICAJCisgICAgICAgIC8vIENvbW1vbiBOYW1lIChDTikKKyAgICAgICAgSkxhYmVsIGpsSUNOID0gbmV3IEpMYWJlbCgiQ29tbW9uIE5hbWUgKENOKSIpOworICAgICAgICBqbElDTi5zZXRGb250KG5ldyBGb250KG51bGwsIEZvbnQuUExBSU4sIDExKSk7CisgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cyBnYmNfamxJQ04gPSAoR3JpZEJhZ0NvbnN0cmFpbnRzKSBnYmNMYWJlbC5jbG9uZSgpOworICAgICAgICBnYmNfamxJQ04uZ3JpZHkgPSA5OworICAgICAgICBKTGFiZWwgamxJQ05WYWx1ZSA9IG5ldyBKTGFiZWwoaUNOKTsKKyAgICAgICAgamxJQ05WYWx1ZS5zZXRGb250KG5ldyBGb250KG51bGwsIEZvbnQuUExBSU4sIDExKSk7CisgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cyBnYmNfamxJQ05WYWx1ZSA9IChHcmlkQmFnQ29uc3RyYWludHMpIGdiY1ZhbHVlLmNsb25lKCk7CisgICAgICAgIGdiY19qbElDTlZhbHVlLmdyaWR5ID0gOTsKKyAgICAgICAgLy8gT3JnYW5pc2F0aW9uIChPKQorICAgICAgICBKTGFiZWwgamxJT3JnID0gbmV3IEpMYWJlbCgiT3JnYW5pc2F0aW9uIChPKSIpOworICAgICAgICBqbElPcmcuc2V0Rm9udChuZXcgRm9udChudWxsLCBGb250LlBMQUlOLCAxMSkpOworICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMgZ2JjX2psSU9yZyA9IChHcmlkQmFnQ29uc3RyYWludHMpIGdiY0xhYmVsLmNsb25lKCk7CisgICAgICAgIGdiY19qbElPcmcuZ3JpZHkgPSAxMDsKKyAgICAgICAgSkxhYmVsIGpsSU9yZ1ZhbHVlID0gbmV3IEpMYWJlbChpT3JnKTsKKyAgICAgICAgamxJT3JnVmFsdWUuc2V0Rm9udChuZXcgRm9udChudWxsLCBGb250LlBMQUlOLCAxMSkpOworICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMgZ2JjX2psSU9yZ1ZhbHVlID0gKEdyaWRCYWdDb25zdHJhaW50cykgZ2JjVmFsdWUuY2xvbmUoKTsKKyAgICAgICAgZ2JjX2psSU9yZ1ZhbHVlLmdyaWR5ID0gMTA7CisgICAgICAgIC8vIE9yZ2FuaXNhdGlvbiBVbml0IChPVSkKKyAgICAgICAgSkxhYmVsIGpsSU9VID0gbmV3IEpMYWJlbCgiT3JnYW5pc2F0aW9uIFVuaXQgKE9VKSIpOworICAgICAgICBqbElPVS5zZXRGb250KG5ldyBGb250KG51bGwsIEZvbnQuUExBSU4sIDExKSk7CisgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cyBnYmNfamxJT1UgPSAoR3JpZEJhZ0NvbnN0cmFpbnRzKSBnYmNMYWJlbC5jbG9uZSgpOworICAgICAgICBnYmNfamxJT1UuZ3JpZHkgPSAxMTsKKyAgICAgICAgSkxhYmVsIGpsSU9VVmFsdWUgPSBuZXcgSkxhYmVsKGlPVSk7CisgICAgICAgIGpsSU9VVmFsdWUuc2V0Rm9udChuZXcgRm9udChudWxsLCBGb250LlBMQUlOLCAxMSkpOworICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMgZ2JjX2psSU9VVmFsdWUgPSAoR3JpZEJhZ0NvbnN0cmFpbnRzKSBnYmNWYWx1ZS5jbG9uZSgpOworICAgICAgICBnYmNfamxJT1VWYWx1ZS5ncmlkeSA9IDExOyAgICAgICAKKyAgICAgICAgLy8gVmFsaWRpdHkKKyAgICAgICAgSkxhYmVsIGpsVmFsaWRpdHkgPSBuZXcgSkxhYmVsKCJWYWxpZGl0eSIpOworICAgICAgICBqbFZhbGlkaXR5LnNldEZvbnQobmV3IEZvbnQobnVsbCwgRm9udC5CT0xELCAxMSkpOworICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMgZ2JjX2psVmFsaWRpdHkgPSAoR3JpZEJhZ0NvbnN0cmFpbnRzKSBnYmNMYWJlbC5jbG9uZSgpOworICAgICAgICBnYmNfamxWYWxpZGl0eS5ncmlkeSA9IDEyOworICAgICAgICBnYmNfamxWYWxpZGl0eS5ncmlkd2lkdGggPSAyOyAvL3Rha2VzIHR3byBjb2x1bW5zICAgCisgICAgICAgIGdiY19qbFZhbGlkaXR5Lmluc2V0cyA9IG5ldyBJbnNldHMoNSwgNSwgNSwgNSk7Ly9oYXMgc2xpZ2h0bHkgYmlnZ2VyIGluc2V0cworICAgICAgICAvL0lzc3VlZCBPbgorICAgICAgICBKTGFiZWwgamxJc3N1ZWRPbiA9IG5ldyBKTGFiZWwoIklzc3VlZCBPbiIpOworICAgICAgICBqbElzc3VlZE9uLnNldEZvbnQobmV3IEZvbnQobnVsbCwgRm9udC5QTEFJTiwgMTEpKTsKKyAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzIGdiY19qbElzc3VlZE9uID0gKEdyaWRCYWdDb25zdHJhaW50cykgZ2JjTGFiZWwuY2xvbmUoKTsKKyAgICAgICAgZ2JjX2psSXNzdWVkT24uZ3JpZHkgPSAxMzsKKyAgICAgICAgSkxhYmVsIGpsSXNzdWVkT25WYWx1ZSA9IG5ldyBKTGFiZWwoY2VydC5nZXROb3RCZWZvcmUoKS50b1N0cmluZygpKTsKKyAgICAgICAgamxJc3N1ZWRPblZhbHVlLnNldEZvbnQobmV3IEZvbnQobnVsbCwgRm9udC5QTEFJTiwgMTEpKTsKKyAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzIGdiY19qbElzc3VlZE9uVmFsdWUgPSAoR3JpZEJhZ0NvbnN0cmFpbnRzKSBnYmNWYWx1ZS5jbG9uZSgpOworICAgICAgICBnYmNfamxJc3N1ZWRPblZhbHVlLmdyaWR5ID0gMTM7CisgICAgICAgIC8vIEV4cGlyZXMgT24KKyAgICAgICAgSkxhYmVsIGpsRXhwaXJlc09uID0gbmV3IEpMYWJlbCgiRXhwaXJlcyBPbiIpOworICAgICAgICBqbEV4cGlyZXNPbi5zZXRGb250KG5ldyBGb250KG51bGwsIEZvbnQuUExBSU4sIDExKSk7CisgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cyBnYmNfamxFeHBpcmVzT24gPSAoR3JpZEJhZ0NvbnN0cmFpbnRzKSBnYmNMYWJlbC5jbG9uZSgpOworICAgICAgICBnYmNfamxFeHBpcmVzT24uZ3JpZHkgPSAxNDsKKyAgICAgICAgSkxhYmVsIGpsRXhwaXJlc09uVmFsdWUgPSBuZXcgSkxhYmVsKGNlcnQuZ2V0Tm90QWZ0ZXIoKS50b1N0cmluZygpKTsKKyAgICAgICAgamxFeHBpcmVzT25WYWx1ZS5zZXRGb250KG5ldyBGb250KG51bGwsIEZvbnQuUExBSU4sIDExKSk7CisgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cyBnYmNfamxFeHBpcmVzT25WYWx1ZSA9IChHcmlkQmFnQ29uc3RyYWludHMpIGdiY1ZhbHVlLmNsb25lKCk7CisgICAgICAgIGdiY19qbEV4cGlyZXNPblZhbHVlLmdyaWR5ID0gMTQ7CisKKyAgICAgICAgLy8gRmluZ2VycHJpbnRzCisgICAgICAgIGJ5dGVbXSBiQ2VydDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJDZXJ0ID0gY2VydC5nZXRFbmNvZGVkKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDTUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiQ291bGQgbm90IGdldCB0aGUgZW5jb2RlZCBmb3JtIG9mIHRoZSBjZXJ0aWZpY2F0ZS4iLAorICAgICAgICAgICAgICAgIGV4KTsKKyAgICAgICAgfQorICAgICAgICBKTGFiZWwgamxGaW5nZXJwcmludHMgPSBuZXcgSkxhYmVsKCJGaW5nZXJwcmludHMiKTsKKyAgICAgICAgamxGaW5nZXJwcmludHMuc2V0Rm9udChuZXcgRm9udChudWxsLCBGb250LkJPTEQsIDExKSk7CisgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cyBnYmNfamxGaW5nZXJwcmludHMgPSAoR3JpZEJhZ0NvbnN0cmFpbnRzKSBnYmNMYWJlbC5jbG9uZSgpOworICAgICAgICBnYmNfamxGaW5nZXJwcmludHMuZ3JpZHkgPSAxNTsKKyAgICAgICAgZ2JjX2psRmluZ2VycHJpbnRzLmdyaWR3aWR0aCA9IDI7IC8vdGFrZXMgdHdvIGNvbHVtbnMgIAorICAgICAgICBnYmNfamxGaW5nZXJwcmludHMuaW5zZXRzID0gbmV3IEluc2V0cyg1LCA1LCA1LCA1KTsvL2hhcyBzbGlnaHRseSBiaWdnZXIgaW5zZXRzCisgICAgICAgIC8vIFNIQS0xIEZpbmdlcnByaW50CisgICAgICAgIEpMYWJlbCBqbFNIQTFGaW5nZXJwcmludCA9IG5ldyBKTGFiZWwoIlNIQTEgRmluZ2VycHJpbnQiKTsKKyAgICAgICAgamxTSEExRmluZ2VycHJpbnQuc2V0Rm9udChuZXcgRm9udChudWxsLCBGb250LlBMQUlOLCAxMSkpOworICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMgZ2JjX2psU0hBMUZpbmdlcnByaW50ID0gKEdyaWRCYWdDb25zdHJhaW50cykgZ2JjTGFiZWwuY2xvbmUoKTsKKyAgICAgICAgZ2JjX2psU0hBMUZpbmdlcnByaW50LmdyaWR5ID0gMTY7CisgICAgICAgIEpMYWJlbCBqbFNIQTFGaW5nZXJwcmludFZhbHVlID0gbmV3IEpMYWJlbChnZXRNZXNzYWdlRGlnZXN0KGJDZXJ0LCAiU0hBMSIpKTsKKyAgICAgICAgamxTSEExRmluZ2VycHJpbnRWYWx1ZS5zZXRGb250KG5ldyBGb250KG51bGwsIEZvbnQuUExBSU4sIDExKSk7CisgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cyBnYmNfamxTSEExRmluZ2VycHJpbnRWYWx1ZSA9IChHcmlkQmFnQ29uc3RyYWludHMpIGdiY1ZhbHVlLmNsb25lKCk7CisgICAgICAgIGdiY19qbFNIQTFGaW5nZXJwcmludFZhbHVlLmdyaWR5ID0gMTY7CisgICAgICAgIC8vIE1ENSBGaW5nZXJwcmludAorICAgICAgICBKTGFiZWwgamxNRDVGaW5nZXJwcmludCA9IG5ldyBKTGFiZWwoIk1ENSBGaW5nZXJwcmludCIpOworICAgICAgICBqbE1ENUZpbmdlcnByaW50LnNldEZvbnQobmV3IEZvbnQobnVsbCwgRm9udC5QTEFJTiwgMTEpKTsKKyAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzIGdiY19qbE1ENUZpbmdlcnByaW50ID0gKEdyaWRCYWdDb25zdHJhaW50cykgZ2JjTGFiZWwuY2xvbmUoKTsKKyAgICAgICAgZ2JjX2psTUQ1RmluZ2VycHJpbnQuZ3JpZHkgPSAxNzsKKyAgICAgICAgSkxhYmVsIGpsTUQ1RmluZ2VycHJpbnRWYWx1ZSA9IG5ldyBKTGFiZWwoZ2V0TWVzc2FnZURpZ2VzdChiQ2VydCwgIk1ENSIpKTsKKyAgICAgICAgamxNRDVGaW5nZXJwcmludFZhbHVlLnNldEZvbnQobmV3IEZvbnQobnVsbCwgRm9udC5QTEFJTiwgMTEpKTsKKyAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzIGdiY19qbE1ENUZpbmdlcnByaW50VmFsdWUgPSAoR3JpZEJhZ0NvbnN0cmFpbnRzKSBnYmNWYWx1ZS5jbG9uZSgpOworICAgICAgICBnYmNfamxNRDVGaW5nZXJwcmludFZhbHVlLmdyaWR5ID0gMTc7CisgICAgICAgIAorICAgICAgICAvLyBFbXB0eSBsYWJlbCB0byBhZGQgYSBiaXQgc3BhY2UgYXQgdGhlIGJvdHRvbSBvZiB0aGUgcGFuZWwKKyAgICAgICAgLy8gdG8gbWFrZSBpdCBsb29rIGxpa2UgZmlyZWZveCdzIHZpZXcgY2VydGlmaWNhdGUgZGlhbG9nCisgICAgICAgIEpMYWJlbCBqbEVtcHR5ID0gbmV3IEpMYWJlbCgiIik7CisgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cyBnYmNfamxFbXB0eSA9IChHcmlkQmFnQ29uc3RyYWludHMpIGdiY0xhYmVsLmNsb25lKCk7CisgICAgICAgIGdiY19qbEVtcHR5LmdyaWR5ID0gMTg7CisgICAgICAgIGdiY19qbEVtcHR5LmdyaWR3aWR0aCA9IDI7IC8vdGFrZXMgdHdvIGNvbHVtbnMKKyAgICAgICAgZ2JjX2psRW1wdHkuaXBhZHkgPSA0MDsKKworICAgICAgICBKUGFuZWwganBDZXJ0aWZpY2F0ZSA9IG5ldyBKUGFuZWwobmV3IEdyaWRCYWdMYXlvdXQoKSk7CisgICAgICAgIGpwQ2VydGlmaWNhdGUuc2V0Qm9yZGVyKG5ldyBDb21wb3VuZEJvcmRlcigKKyAgICAgICAgICAgIG5ldyBFbXB0eUJvcmRlcigxNSwgMTUsIDE1LCAxNSksIG5ldyBFdGNoZWRCb3JkZXIoKSkpOworCisgICAgICAgIGlmIChpbnRlbmRlZFVzZXMgIT0gbnVsbCl7CisgICAgICAgIAlqcENlcnRpZmljYXRlLmFkZChqcFVzZXMsIGdiY19qcFVzZXMpOworICAgICAgICB9CisgICAgICAgIGpwQ2VydGlmaWNhdGUuYWRkKGpsSXNzdWVkVG8sIGdiY19qbElzc3VlZFRvKTsgLy8gSXNzdWVkIFRvCisgICAgICAgIGpwQ2VydGlmaWNhdGUuYWRkKGpsQ04sIGdiY19qbENOKTsKKyAgICAgICAganBDZXJ0aWZpY2F0ZS5hZGQoamxDTlZhbHVlLCBnYmNfamxDTlZhbHVlKTsKKyAgICAgICAganBDZXJ0aWZpY2F0ZS5hZGQoamxPcmcsIGdiY19qbE9yZyk7CisgICAgICAgIGpwQ2VydGlmaWNhdGUuYWRkKGpsT3JnVmFsdWUsIGdiY19qbE9yZ1ZhbHVlKTsgICAgICAgIAorICAgICAgICBqcENlcnRpZmljYXRlLmFkZChqbE9VLCBnYmNfamxPVSk7CisgICAgICAgIGpwQ2VydGlmaWNhdGUuYWRkKGpsT1VWYWx1ZSwgZ2JjX2psT1VWYWx1ZSk7CisgICAgICAgIC8vanBDZXJ0aWZpY2F0ZS5hZGQoamxFbWFpbCwgZ2JjX2psRW1haWwpOworICAgICAgICAvL2pwQ2VydGlmaWNhdGUuYWRkKGpsRW1haWxWYWx1ZSwgZ2JjX2psRW1haWxWYWx1ZSk7CisgICAgICAgIGpwQ2VydGlmaWNhdGUuYWRkKGpsU04sIGdiY19qbFNOKTsKKyAgICAgICAganBDZXJ0aWZpY2F0ZS5hZGQoamxTTlZhbHVlLCBnYmNfamxTTlZhbHVlKTsKKyAgICAgICAganBDZXJ0aWZpY2F0ZS5hZGQoamxWZXJzaW9uLCBnYmNfamxWZXJzaW9uKTsKKyAgICAgICAganBDZXJ0aWZpY2F0ZS5hZGQoamxWZXJzaW9uVmFsdWUsIGdiY19qbFZlcnNpb25WYWx1ZSk7CisgICAgICAgIGpwQ2VydGlmaWNhdGUuYWRkKGpsSXNzdWVkQnksIGdiY19qbElzc3VlZEJ5KTsgLy9Jc3N1ZWQgQnkKKyAgICAgICAganBDZXJ0aWZpY2F0ZS5hZGQoamxJQ04sIGdiY19qbElDTik7CisgICAgICAgIGpwQ2VydGlmaWNhdGUuYWRkKGpsSUNOVmFsdWUsIGdiY19qbElDTlZhbHVlKTsKKyAgICAgICAganBDZXJ0aWZpY2F0ZS5hZGQoamxJT3JnLCBnYmNfamxJT3JnKTsKKyAgICAgICAganBDZXJ0aWZpY2F0ZS5hZGQoamxJT3JnVmFsdWUsIGdiY19qbElPcmdWYWx1ZSk7ICAgICAgICAKKyAgICAgICAganBDZXJ0aWZpY2F0ZS5hZGQoamxJT1UsIGdiY19qbElPVSk7CisgICAgICAgIGpwQ2VydGlmaWNhdGUuYWRkKGpsSU9VVmFsdWUsIGdiY19qbElPVVZhbHVlKTsKKyAgICAgICAganBDZXJ0aWZpY2F0ZS5hZGQoamxWYWxpZGl0eSwgZ2JjX2psVmFsaWRpdHkpOyAvL1ZhbGlkaXR5CisgICAgICAgIGpwQ2VydGlmaWNhdGUuYWRkKGpsSXNzdWVkT24sIGdiY19qbElzc3VlZE9uKTsKKyAgICAgICAganBDZXJ0aWZpY2F0ZS5hZGQoamxJc3N1ZWRPblZhbHVlLCBnYmNfamxJc3N1ZWRPblZhbHVlKTsKKyAgICAgICAganBDZXJ0aWZpY2F0ZS5hZGQoamxFeHBpcmVzT24sIGdiY19qbEV4cGlyZXNPbik7CisgICAgICAgIGpwQ2VydGlmaWNhdGUuYWRkKGpsRXhwaXJlc09uVmFsdWUsIGdiY19qbEV4cGlyZXNPblZhbHVlKTsgCisgICAgICAgIGpwQ2VydGlmaWNhdGUuYWRkKGpsRmluZ2VycHJpbnRzLCBnYmNfamxGaW5nZXJwcmludHMpOyAvL0ZpbmdlcnByaW50cworICAgICAgICBqcENlcnRpZmljYXRlLmFkZChqbFNIQTFGaW5nZXJwcmludCwgZ2JjX2psU0hBMUZpbmdlcnByaW50KTsKKyAgICAgICAganBDZXJ0aWZpY2F0ZS5hZGQoamxTSEExRmluZ2VycHJpbnRWYWx1ZSwgZ2JjX2psU0hBMUZpbmdlcnByaW50VmFsdWUpOworICAgICAgICBqcENlcnRpZmljYXRlLmFkZChqbE1ENUZpbmdlcnByaW50LCBnYmNfamxNRDVGaW5nZXJwcmludCk7CisgICAgICAgIGpwQ2VydGlmaWNhdGUuYWRkKGpsTUQ1RmluZ2VycHJpbnRWYWx1ZSwgZ2JjX2psTUQ1RmluZ2VycHJpbnRWYWx1ZSk7CisgICAgICAgIGpwQ2VydGlmaWNhdGUuYWRkKGpsRW1wdHksIGdiY19qbEVtcHR5KTsgLy9FbXB0eSBsYWJlbCB0byBnZXQgc29tZSB2ZXJ0aWNhbCBzcGFjZSBvbiB0aGUgZnJhbWUKKworICAgICAgICAvLyBMaXN0IG9mIHNlcnZpY2VVUkxzCisgICAgICAgIEpQYW5lbCBqcFVSTHMgID0gbnVsbDsgLy8gUGFuZWwgdG8gaG9sZCB0aGUgVVJMIGxpc3QKKyAgICAgICAgaWYgKHNlcnZpY2VVUkxzIT1udWxsKXsgLy9pZiBzZXJ2aWNlIHNlcnZpY2VVUkxzIGFyZSBub3QgbnVsbCAoZXZlbiBpZiBlbXB0eSAtIHNob3cgZW1wdHkgbGlzdCkKKworICAgICAgICAJanBVUkxzID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOworICAgICAgICAJanBVUkxzLnNldEJvcmRlcihuZXcgQ29tcG91bmRCb3JkZXIoCisgICAgICAgICAgICAgICAgICAgIG5ldyBFbXB0eUJvcmRlcigwLCAxNSwgMCwgMTUpLCBuZXcgRXRjaGVkQm9yZGVyKCkpKTsKKyAgICAgICAgICAgIC8vIExhYmVsCisgICAgICAgICAgICBKTGFiZWwgamxTZXJ2aWNlVVJMcyA9IG5ldyBKTGFiZWwgKCJTZXJ2aWNlIFVSTHMgdGhpcyBrZXkgcGFpciB3aWxsIGJlIHVzZWQgZm9yOiIpOworICAgICAgICAgICAgamxTZXJ2aWNlVVJMcy5zZXRGb250KG5ldyBGb250KG51bGwsIEZvbnQuQk9MRCwgMTEpKTsKKyAgICAgICAgICAgIGpsU2VydmljZVVSTHMuc2V0Qm9yZGVyKG5ldyBFbXB0eUJvcmRlcig1LDUsNSw1KSk7ICAgIAorICAgICAgCisgICAgICAgICAgICAvLyBOZXcgZW1wdHkgc2VydmljZSBzZXJ2aWNlVVJMcyBsaXN0CisgICAgICAgICAgICBEZWZhdWx0TGlzdE1vZGVsIGpsdE1vZGVsID0gbmV3IERlZmF1bHRMaXN0TW9kZWwoKTsKKyAgICAgICAgICAgIEpMaXN0IGpsdFNlcnZpY2VVUkxzID0gbmV3IEpMaXN0KGpsdE1vZGVsKTsgCisgICAgICAgICAgICBmb3IgKFN0cmluZyB1cmwgOiBzZXJ2aWNlVVJMcyl7CisgICAgICAgICAgICAJamx0TW9kZWwuYWRkRWxlbWVudCh1cmwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgamx0U2VydmljZVVSTHMuc2V0VmlzaWJsZVJvd0NvdW50KDUpOyAvL2Rvbid0IHNob3cgbW9yZSB0aGFuIDUgb3RoZXJ3aXNlIHRoZSB3aW5kb3cgaXMgdG9vIGJpZworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBTY3JvbGwgcGFuZSBmb3Igc2VydmljZSBzZXJ2aWNlVVJMcworICAgICAgICAgICAgSlNjcm9sbFBhbmUganNwU2VydmljZVVSTHMgPSBuZXcgSlNjcm9sbFBhbmUoamx0U2VydmljZVVSTHMsCisgICAgICAgICAgICAgICAgICAgIEpTY3JvbGxQYW5lLlZFUlRJQ0FMX1NDUk9MTEJBUl9BU19ORUVERUQsCisgICAgICAgICAgICAgICAgICAgIEpTY3JvbGxQYW5lLkhPUklaT05UQUxfU0NST0xMQkFSX0FTX05FRURFRCk7CisgICAgICAgICAgICBqc3BTZXJ2aWNlVVJMcy5nZXRWaWV3cG9ydCgpLnNldEJhY2tncm91bmQoamx0U2VydmljZVVSTHMuZ2V0QmFja2dyb3VuZCgpKTsKKworICAgICAgICAgICAganBVUkxzLmFkZChqbFNlcnZpY2VVUkxzLCBCb3JkZXJMYXlvdXQuTk9SVEgpOworICAgICAgICAgICAganBVUkxzLmFkZChqc3BTZXJ2aWNlVVJMcywgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFB1dCBpdCBvbiB0aGUgbWFpbiBjb250ZW50IHBhbmUKKyAgICAgICAgICAgIGdldENvbnRlbnRQYW5lKCkuYWRkKGpwVVJMcywgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIE9LIGJ1dHRvbgorICAgICAgICBKUGFuZWwganBPSyA9IG5ldyBKUGFuZWwobmV3IEZsb3dMYXlvdXQoRmxvd0xheW91dC5DRU5URVIpKTsKKworICAgICAgICBmaW5hbCBKQnV0dG9uIGpiT0sgPSBuZXcgSkJ1dHRvbigiT0siKTsKKyAgICAgICAgamJPSy5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZ0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9rUHJlc3NlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBqcE9LLmFkZChqYk9LKTsKKyAgICAgICAgIAorICAgICAgICAvLyBQdXQgaXQgYWxsIHRvZ2V0aGVyIChwYW5lbCB3aXRoIFVSTCBsaXN0IGlzIGFscmVhZHkgYWRkZWQsIGlmIGl0IHdhcyBub3QgbnVsbCkKKyAgICAgICAgZ2V0Q29udGVudFBhbmUoKS5hZGQoanBDZXJ0aWZpY2F0ZSwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKKyAgICAgICAgZ2V0Q29udGVudFBhbmUoKS5hZGQoanBPSywgQm9yZGVyTGF5b3V0LlNPVVRIKTsKKworICAgICAgICAvLyBSZXNpemluZyB3cmVha3MgaGF2b2MKKyAgICAgICAgc2V0UmVzaXphYmxlKGZhbHNlKTsKKworICAgICAgICBhZGRXaW5kb3dMaXN0ZW5lcihuZXcgV2luZG93QWRhcHRlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZXZ0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsb3NlRGlhbG9nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIGdldFJvb3RQYW5lKCkuc2V0RGVmYXVsdEJ1dHRvbihqYk9LKTsKKworICAgICAgICBwYWNrKCk7CisKKyAgICAgICAgU3dpbmdVdGlsaXRpZXMuaW52b2tlTGF0ZXIobmV3IFJ1bm5hYmxlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBqYk9LLnJlcXVlc3RGb2N1cygpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0IHRoZSBkaWdlc3Qgb2YgYSBtZXNzYWdlIGFzIGEgZm9ybWF0dGVkIFN0cmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiTWVzc2FnZSBUaGUgbWVzc2FnZSB0byBkaWdlc3QKKyAgICAgKiBAcGFyYW0gZGlnZXN0VHlwZSBUaGUgbWVzc2FnZSBkaWdlc3QgYWxnb3JpdGhtCisgICAgICogQHJldHVybiBUaGUgbWVzc2FnZSBkaWdlc3QKKyAgICAgKiBAdGhyb3dzIENNRXhjZXB0aW9uIElmIHRoZXJlIHdhcyBhIHByb2JsZW0gZ2VuZXJhdGluZyB0aGUgbWVzc2FnZQorICAgICAqIGRpZ2VzdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2VEaWdlc3QoYnl0ZVtdIGJNZXNzYWdlLAorICAgICAgICBTdHJpbmcgZGlnZXN0VHlwZSkKKyAgICAgICAgdGhyb3dzIENNRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyBDcmVhdGUgbWVzc2FnZSBkaWdlc3Qgb2JqZWN0IHVzaW5nIHRoZSBzdXBwbGllZCBhbGdvcml0aG0KKyAgICAgICAgTWVzc2FnZURpZ2VzdCBtZXNzYWdlRGlnZXN0OworICAgICAgICB0cnkgeworICAgICAgICAgICAgbWVzc2FnZURpZ2VzdCA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoZGlnZXN0VHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENNRXhjZXB0aW9uKCJGYWlsZWQgdG8gY3JlYXRlIG1lc3NhZ2UgZGlnZXN0LiIsIGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSByYXcgbWVzc2FnZSBkaWdlc3QKKyAgICAgICAgYnl0ZVtdIGJGaW5nZXJQcmludCA9IG1lc3NhZ2VEaWdlc3QuZGlnZXN0KGJNZXNzYWdlKTsKKworICAgICAgICAvLyBQbGFjZSB0aGUgcmF3IG1lc3NhZ2UgZGlnZXN0IGludG8gYSBTdHJpbmdCdWZmZXIgYXMgYSBIZXggbnVtYmVyCisgICAgICAgIFN0cmluZ0J1ZmZlciBzdHJCdWZmID0gbmV3IFN0cmluZ0J1ZmZlcigKKyAgICAgICAgICAgIG5ldyBCaWdJbnRlZ2VyKDEsIGJGaW5nZXJQcmludCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkpOworCisgICAgICAgIC8vIE9kZCBudW1iZXIgb2YgY2hhcmFjdGVycyBzbyBhZGQgaW4gYSBwYWRkaW5nICIwIgorICAgICAgICBpZiAoKHN0ckJ1ZmYubGVuZ3RoKCkgJSAyKSAhPSAwKSB7CisgICAgICAgICAgICBzdHJCdWZmLmluc2VydCgwLCAnMCcpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUGxhY2UgY29sb25zIGF0IGV2ZXJ5IHR3byBoZXggY2hhcmFjdGVycworICAgICAgICBpZiAoc3RyQnVmZi5sZW5ndGgoKSA+IDIpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGlDbnQgPSAyOyBpQ250IDwgc3RyQnVmZi5sZW5ndGgoKTsgaUNudCArPSAzKSB7CisgICAgICAgICAgICAgICAgc3RyQnVmZi5pbnNlcnQoaUNudCwgJzonKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJldHVybiB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UgZGlnZXN0CisgICAgICAgIHJldHVybiBzdHJCdWZmLnRvU3RyaW5nKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldHMgdGhlIGludGVuZGVkIGNlcnRpZmljYXRlIHVzZXMsIGkuZS4gTmV0c2NhcGUgQ2VydGlmaWNhdGUgVHlwZSBleHRlbnNpb24gKDIuMTYuODQwLjEuMTEzNzMwLjEuMSkgCisgICAgICogdmFsdWUgYXMgYSBzdHJpbmcKKyAgICAgKiBAcGFyYW0gdmFsdWUgRXh0ZW5zaW9uIHZhbHVlIGFzIGEgREVSLWVuY29kZWQgT0NURVQgc3RyaW5nCisgICAgICogQHJldHVybiBFeHRlbnNpb24gdmFsdWUgYXMgYSBzdHJpbmcKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXRJbnRlbmRlZFVzZXMoYnl0ZVtdIHZhbHVlKQorICAgIHsKKyAgICAJCisgICAgICAgIC8vIE5ldHNjYXBlIENlcnRpZmljYXRlIFR5cGVzICgyLjE2Ljg0MC4xLjExMzczMC4xLjEpCisgICAgICAgIGludFtdIElOVEVOREVEX1VTRVMgPSBuZXcgaW50W10geworICAgICAgICAgICAgTmV0c2NhcGVDZXJ0VHlwZS5zc2xDbGllbnQsCisgICAgICAgICAgICBOZXRzY2FwZUNlcnRUeXBlLnNzbFNlcnZlciwKKyAgICAgICAgICAgIE5ldHNjYXBlQ2VydFR5cGUuc21pbWUsCisgICAgICAgICAgICBOZXRzY2FwZUNlcnRUeXBlLm9iamVjdFNpZ25pbmcsCisgICAgICAgICAgICBOZXRzY2FwZUNlcnRUeXBlLnJlc2VydmVkLAorICAgICAgICAgICAgTmV0c2NhcGVDZXJ0VHlwZS5zc2xDQSwKKyAgICAgICAgICAgIE5ldHNjYXBlQ2VydFR5cGUuc21pbWVDQSwKKyAgICAgICAgICAgIE5ldHNjYXBlQ2VydFR5cGUub2JqZWN0U2lnbmluZ0NBLAorICAgICAgICB9OworICAgICAgICAKKyAgICAgICAgLy8gTmV0c2NhcGUgQ2VydGlmaWNhdGUgVHlwZSBzdHJpbmdzICgyLjE2Ljg0MC4xLjExMzczMC4xLjEpCisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IElOVEVOREVEX1VTRVNfU1RSSU5HUyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiAoKTsKKyAgICAgICAgSU5URU5ERURfVVNFU19TVFJJTkdTLnB1dCgiMTI4IiwgIlNTTCBDbGllbnQiKTsKKyAgICAgICAgSU5URU5ERURfVVNFU19TVFJJTkdTLnB1dCgiNjQiLCAiU1NMIFNlcnZlciIpOworICAgICAgICBJTlRFTkRFRF9VU0VTX1NUUklOR1MucHV0KCIzMiIsICJTL01JTUUiKTsKKyAgICAgICAgSU5URU5ERURfVVNFU19TVFJJTkdTLnB1dCgiMTYiLCAiT2JqZWN0IFNpZ25pbmciKTsKKyAgICAgICAgSU5URU5ERURfVVNFU19TVFJJTkdTLnB1dCgiOCIsICJSZXNlcnZlZCIpOworICAgICAgICBJTlRFTkRFRF9VU0VTX1NUUklOR1MucHV0KCI0IiwgIlNTTCBDQSIpOworICAgICAgICBJTlRFTkRFRF9VU0VTX1NUUklOR1MucHV0KCIyIiwgIlMvTUlNRSBDQSIpOworICAgICAgICBJTlRFTkRFRF9VU0VTX1NUUklOR1MucHV0KCIxIiwgIk9iamVjdCBTaWduaW5nIENBIik7CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgLy8gR2V0IG9jdGV0IHN0cmluZyBmcm9tIGV4dGVuc2lvbiB2YWx1ZQorICAgICAgICBBU04xT2N0ZXRTdHJpbmcgZnJvbUJ5dGVBcnJheSA9IG5ldyBERVJPY3RldFN0cmluZyh2YWx1ZSk7CisJCWJ5dGVbXSBvY3RldHMgPSBmcm9tQnl0ZUFycmF5LmdldE9jdGV0cygpOyAgICAgICAgICAgIAorICAgIAlERVJCaXRTdHJpbmcgZnJvbUJ5dGVBcnJheTIgPSBuZXcgREVSQml0U3RyaW5nKG9jdGV0cyk7CisJCWludCB2YWwgPSBuZXcgTmV0c2NhcGVDZXJ0VHlwZShmcm9tQnl0ZUFycmF5MikuaW50VmFsdWUoKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHN0ckJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSBJTlRFTkRFRF9VU0VTLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBpbnQgdXNlID0gSU5URU5ERURfVVNFU1tpXTsKKyAgICAgICAgICAgIGlmICgodmFsICYgdXNlKSA9PSB1c2UpIHsKKyAgICAgICAgICAgICAgICBzdHJCdWZmLmFwcGVuZChJTlRFTkRFRF9VU0VTX1NUUklOR1MuZ2V0KFN0cmluZy52YWx1ZU9mKHVzZSkpKyIsIFxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gcmVtb3ZlIHRoZSBsYXN0ICIsIFxuIiBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlcgorICAgICAgICBTdHJpbmcgc3RyID0gc3RyQnVmZi50b1N0cmluZygpOworICAgICAgICBzdHIgPSBzdHIuc3Vic3RyaW5nKDAsIHN0ci5sZW5ndGgoKS0zKTsKKyAgICAgICAgcmV0dXJuIHN0cjsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogT0sgYnV0dG9uIHByZXNzZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIG9rUHJlc3NlZCgpCisgICAgeworICAgICAgICBjbG9zZURpYWxvZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgVmlldyBDZXJ0aWZpY2F0ZSBFbnRyeSBkaWFsb2cuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNsb3NlRGlhbG9nKCkKKyAgICB7CisgICAgICAgIHNldFZpc2libGUoZmFsc2UpOworICAgICAgICBkaXNwb3NlKCk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL25ldC9zZi90YXZlcm5hL3QyL3dvcmtiZW5jaC91aS9jcmVkZW50aWFsbWFuYWdlci9WaWV3UGFzc3dvcmREaWFsb2cuamF2YSBiL3NyYy9tYWluL2phdmEvbmV0L3NmL3RhdmVybmEvdDIvd29ya2JlbmNoL3VpL2NyZWRlbnRpYWxtYW5hZ2VyL1ZpZXdQYXNzd29yZERpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNTg0ODYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL25ldC9zZi90YXZlcm5hL3QyL3dvcmtiZW5jaC91aS9jcmVkZW50aWFsbWFuYWdlci9WaWV3UGFzc3dvcmREaWFsb2cuamF2YQpAQCAtMCwwICsxLDE1NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgVW5pdmVyc2l0eSBvZiBNYW5jaGVzdGVyICAgCisgKiAKKyAqICBNb2RpZmljYXRpb25zIHRvIHRoZSBpbml0aWFsIGNvZGUgYmFzZSBhcmUgY29weXJpZ2h0IG9mIHRoZWlyCisgKiAgcmVzcGVjdGl2ZSBhdXRob3JzLCBvciB0aGVpciBlbXBsb3llcnMgYXMgYXBwcm9wcmlhdGUuCisgKiAKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogICAgCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAgICAKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG5ldC5zZi50YXZlcm5hLnQyLndvcmtiZW5jaC51aS5jcmVkZW50aWFsbWFuYWdlcjsKKworaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKK2ltcG9ydCBqYXZhLmF3dC5GbG93TGF5b3V0OworaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OworaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOworaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0FkYXB0ZXI7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQ7CisKK2ltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOworaW1wb3J0IGphdmF4LnN3aW5nLkpEaWFsb2c7CitpbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOworaW1wb3J0IGphdmF4LnN3aW5nLkpMYWJlbDsKK2ltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7CitpbXBvcnQgamF2YXguc3dpbmcuSlRleHRGaWVsZDsKK2ltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuQ29tcG91bmRCb3JkZXI7CitpbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkVtcHR5Qm9yZGVyOworaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5FdGNoZWRCb3JkZXI7CisKKy8qKgorICogRGlhbG9nIHVzZWQgZm9yIHZpZXdpbmcgcGFzc3dvcmQuCisgKiAKKyAqIEBhdXRob3IgQWxleGFuZHJhIE5lbmFkaWMKKyAqLworQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCitwdWJsaWMgY2xhc3MgVmlld1Bhc3N3b3JkRGlhbG9nIGV4dGVuZHMgSkRpYWxvZyB7CisJCisJLy8gUGFzc3dvcmQgZmllbGQgCisgICAgcHJpdmF0ZSBKVGV4dEZpZWxkIGp0ZlBhc3N3b3JkOworICAgIAorICAgIC8vIFBhc3N3b3JkIHZhbHVlCisgICAgcHJpdmF0ZSBTdHJpbmcgc1Bhc3N3b3JkOworCisgICAvKioKKyAgICAgKiBDcmVhdGVzIG5ldyBWaWV3UGFzc3dvcmREaWFsb2cgZGlhbG9nIHdoZXJlIHRoZSBwYXJlbnQgaXMgYSBmcmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmlld1Bhc3N3b3JkRGlhbG9nKEpGcmFtZSBwYXJlbnQsIGJvb2xlYW4gYk1vZGFsLCBTdHJpbmcgcGFzc3dvcmQpCisgICAgeworICAgICAgICB0aGlzKHBhcmVudCwgIlZpZXcgcGFzc3dvcmQiLCBiTW9kYWwsIHBhc3N3b3JkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIG5ldyBWaWV3UGFzc3dvcmREaWFsb2cgZGlhbG9nIHdoZXJlIHRoZSBwYXJlbnQgaXMgYSBmcmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgUGFyZW50IGZyYW1lCisgICAgICogQHBhcmFtIHNUaXRsZSBUaGUgZGlhbG9nJ3MgdGl0bGUKKyAgICAgKiBAcGFyYW0gYk1vZGFsIElzIGRpYWxvZyBtb2RhbD8KKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQgUGFzc3dvcmQgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgVmlld1Bhc3N3b3JkRGlhbG9nKEpGcmFtZSBwYXJlbnQsIFN0cmluZyBzVGl0bGUsIGJvb2xlYW4gYk1vZGFsLCBTdHJpbmcgcGFzc3dvcmQpCisgICAgeworICAgICAgICBzdXBlcihwYXJlbnQsIHNUaXRsZSwgYk1vZGFsKTsgIAorICAgICAgICBzUGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgICAgICAgaW5pdENvbXBvbmVudHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIG5ldyBWaWV3UGFzc3dvcmREaWFsb2cgZGlhbG9nIHdoZXJlIHRoZSBwYXJlbnQgaXMgYSBkaWFsb2cuCisgICAgICovCisgICAgcHVibGljIFZpZXdQYXNzd29yZERpYWxvZyhKRGlhbG9nIHBhcmVudCwgYm9vbGVhbiBiTW9kYWwsIFN0cmluZyBwYXNzd29yZCkKKyAgICB7CisgICAgICAgIHRoaXMocGFyZW50LCAiVmlldyBwYXNzd29yZCIsIGJNb2RhbCwgcGFzc3dvcmQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgbmV3IFZpZXdQYXNzd29yZERpYWxvZyBkaWFsb2cgd2hlcmUgdGhlIHBhcmVudCBpcyBhIGRpYWxvZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmlld1Bhc3N3b3JkRGlhbG9nKEpEaWFsb2cgcGFyZW50LCBTdHJpbmcgc1RpdGxlLCBib29sZWFuIGJNb2RhbCwgU3RyaW5nIHBhc3N3b3JkKQorICAgIHsKKyAgICAgICAgc3VwZXIocGFyZW50LCBzVGl0bGUsIGJNb2RhbCk7CisgICAgICAgIHNQYXNzd29yZCA9IHBhc3N3b3JkOworICAgICAgICBpbml0Q29tcG9uZW50cygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpc2UgdGhlIGRpYWxvZydzIEdVSSBjb21wb25lbnRzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbml0Q29tcG9uZW50cygpCisgICAgeworICAgICAgICBnZXRDb250ZW50UGFuZSgpLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOworCisgICAgICAgIEpMYWJlbCBqbFBhc3N3b3JkID0gbmV3IEpMYWJlbCgiUGFzc3dvcmQgdmFsdWUiKTsKKworICAgICAgICAvL1BvcHVsYXRlIHRoZSBwYXNzd29yZCBmaWVsZAorICAgICAgICBqdGZQYXNzd29yZCA9IG5ldyBKVGV4dEZpZWxkKDE1KTsKKyAgICAgICAganRmUGFzc3dvcmQuc2V0VGV4dChzUGFzc3dvcmQpOworICAgICAgICBqdGZQYXNzd29yZC5zZXRFZGl0YWJsZShmYWxzZSk7CisgICAgICAgIAorICAgICAgICBKQnV0dG9uIGpiT0sgPSBuZXcgSkJ1dHRvbigiT0siKTsKKyAgICAgICAgamJPSy5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZ0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgCWNsb3NlRGlhbG9nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICAKKyAgICAgICAgSlBhbmVsIGpwUGFzc3dvcmQgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7CisgICAgICAgIGpwUGFzc3dvcmQuYWRkKGpsUGFzc3dvcmQsIEJvcmRlckxheW91dC5OT1JUSCk7CisgICAgICAgIGpwUGFzc3dvcmQuYWRkKGp0ZlBhc3N3b3JkLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKyAgICAgICAgLy9qcFBhc3N3b3JkLnNldEJvcmRlcihuZXcgRW1wdHlCb3JkZXIoNSwgNSwgNSwgNSkpOworICAgICAgICBqcFBhc3N3b3JkLnNldEJvcmRlcihuZXcgQ29tcG91bmRCb3JkZXIoCisgICAgICAgICAgICAgICAgbmV3IEVtcHR5Qm9yZGVyKDUsIDUsIDUsIDUpLCBuZXcgRXRjaGVkQm9yZGVyKCkpKTsKKyAgICAgICAgCisgICAgICAgIEpQYW5lbCBqcEJ1dHRvbnMgPSBuZXcgSlBhbmVsKG5ldyBGbG93TGF5b3V0KEZsb3dMYXlvdXQuQ0VOVEVSKSk7CisgICAgICAgIGpwQnV0dG9ucy5hZGQoamJPSyk7CisgICAgICAgIAorICAgICAgICBnZXRDb250ZW50UGFuZSgpLmFkZChqcFBhc3N3b3JkLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKyAgICAgICAgZ2V0Q29udGVudFBhbmUoKS5hZGQoanBCdXR0b25zLCBCb3JkZXJMYXlvdXQuU09VVEgpOworCisgICAgICAgIGFkZFdpbmRvd0xpc3RlbmVyKG5ldyBXaW5kb3dBZGFwdGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dFdmVudCBldnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xvc2VEaWFsb2coKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgc2V0UmVzaXphYmxlKGZhbHNlKTsKKworICAgICAgICBnZXRSb290UGFuZSgpLnNldERlZmF1bHRCdXR0b24oamJPSyk7CisKKyAgICAgICAgcGFjaygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBkaWFsb2cuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNsb3NlRGlhbG9nKCkKKyAgICB7CisgICAgICAgIHNldFZpc2libGUoZmFsc2UpOworICAgICAgICBkaXNwb3NlKCk7CisgICAgfQorfQorCisKKwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9uZXQvc2YvdGF2ZXJuYS90Mi93b3JrYmVuY2gvdWkvY3JlZGVudGlhbG1hbmFnZXIvVmlld1VzZXJuYW1lUGFzc3dvcmRFbnRyeURpYWxvZy5qYXZhIGIvc3JjL21haW4vamF2YS9uZXQvc2YvdGF2ZXJuYS90Mi93b3JrYmVuY2gvdWkvY3JlZGVudGlhbG1hbmFnZXIvVmlld1VzZXJuYW1lUGFzc3dvcmRFbnRyeURpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZTkyZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL25ldC9zZi90YXZlcm5hL3QyL3dvcmtiZW5jaC91aS9jcmVkZW50aWFsbWFuYWdlci9WaWV3VXNlcm5hbWVQYXNzd29yZEVudHJ5RGlhbG9nLmphdmEKQEAgLTAsMCArMSwxODMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIFVuaXZlcnNpdHkgb2YgTWFuY2hlc3RlciAgIAorICogCisgKiAgTW9kaWZpY2F0aW9ucyB0byB0aGUgaW5pdGlhbCBjb2RlIGJhc2UgYXJlIGNvcHlyaWdodCBvZiB0aGVpcgorICogIHJlc3BlY3RpdmUgYXV0aG9ycywgb3IgdGhlaXIgZW1wbG95ZXJzIGFzIGFwcHJvcHJpYXRlLgorICogCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAgIAorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogICAgCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBuZXQuc2YudGF2ZXJuYS50Mi53b3JrYmVuY2gudWkuY3JlZGVudGlhbG1hbmFnZXI7CisKK2ltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7CitpbXBvcnQgamF2YS5hd3QuRmxvd0xheW91dDsKK2ltcG9ydCBqYXZhLmF3dC5HcmlkTGF5b3V0OworaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OworaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOworaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0FkYXB0ZXI7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQ7CisKK2ltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOworaW1wb3J0IGphdmF4LnN3aW5nLkpEaWFsb2c7CitpbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOworaW1wb3J0IGphdmF4LnN3aW5nLkpMYWJlbDsKK2ltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7CitpbXBvcnQgamF2YXguc3dpbmcuSlRleHRGaWVsZDsKK2ltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuQ29tcG91bmRCb3JkZXI7CitpbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkVtcHR5Qm9yZGVyOworaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5FdGNoZWRCb3JkZXI7CisKKy8qKgorICogRGlhbG9nIHVzZWQgZm9yIHZpZXdpbmcgc2VydmljZSBVUkwsIHVzZXJuYW1lIGFuZCBwYXNzd29yZC4KKyAqIAorICogQGF1dGhvciBBbGV4IE5lbmFkaWMKKyAqLworcHVibGljIGNsYXNzIFZpZXdVc2VybmFtZVBhc3N3b3JkRW50cnlEaWFsb2cKKyAgICBleHRlbmRzIEpEaWFsb2cKK3sKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzIyNDkwNDk5NzM0OTY0NDg1M0w7CisKKwkvLyBTZXJ2aWNlIFVSTCBmaWVsZCAKKyAgICBwcml2YXRlIEpUZXh0RmllbGQganRmU2VydmljZVVSTDsKKyAgICAKKyAgICAvLyBVc2VybmFtZSBmaWVsZCAKKyAgICBwcml2YXRlIEpUZXh0RmllbGQganRmVXNlcm5hbWU7CisgICAgCisgICAgLy8gUGFzc3dvcmQgZmllbGQgCisgICAgcHJpdmF0ZSBKVGV4dEZpZWxkIGp0ZlBhc3N3b3JkOworCisgICAgLy8gU2VydmljZSBVUkwgdmFsdWUKKyAgICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlVVJMOyAgICAKKyAgICAKKyAgICAvLyBTZXJ2aWNlIHVzZXJuYW1lIHZhbHVlCisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlcm5hbWU7CisgICAgCisgICAgLy8gU2VydmljZSBwYXNzd29yZCB2YWx1ZQorICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBuZXcgVmlld1Bhc3N3b3JkRW50cnlEaWFsb2cgZGlhbG9nIHdoZXJlIHRoZSBwYXJlbnQgaXMgYSBmcmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmlld1VzZXJuYW1lUGFzc3dvcmRFbnRyeURpYWxvZyhKRnJhbWUgcGFyZW50LCBTdHJpbmcgY3VycmVudFVSTCwgU3RyaW5nIGN1cnJlbnRVc2VybmFtZSwgU3RyaW5nIGN1cnJlbnRQYXNzd29yZCkKKyAgICB7CisgICAgICAgIHN1cGVyKHBhcmVudCwgIlZpZXcgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGZvciBhIHNlcnZpY2UiLCB0cnVlKTsKKyAgICAgICAgc2VydmljZVVSTCA9IGN1cnJlbnRVUkw7CisgICAgICAgIHVzZXJuYW1lID0gY3VycmVudFVzZXJuYW1lOworICAgICAgICBwYXNzd29yZCA9IGN1cnJlbnRQYXNzd29yZDsKKyAgICAgICAgaW5pdENvbXBvbmVudHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIG5ldyBWaWV3UGFzc3dvcmREaWFsb2cgZGlhbG9nIHdoZXJlIHRoZSBwYXJlbnQgaXMgYSBkaWFsb2cuCisgICAgICovCisgICAgcHVibGljIFZpZXdVc2VybmFtZVBhc3N3b3JkRW50cnlEaWFsb2coSkRpYWxvZyBwYXJlbnQsIFN0cmluZyBjdXJyZW50VVJMLCBTdHJpbmcgY3VycmVudFVzZXJuYW1lLCBTdHJpbmcgY3VycmVudFBhc3N3b3JkKQorICAgIHsKKyAgICAgICAgc3VwZXIocGFyZW50LCAiVmlldyB1c2VybmFtZSBhbmQgcGFzc3dvcmQgZm9yIGEgc2VydmljZSIsIHRydWUpOworICAgICAgICBzZXJ2aWNlVVJMID0gY3VycmVudFVSTDsKKyAgICAgICAgdXNlcm5hbWUgPSBjdXJyZW50VXNlcm5hbWU7CisgICAgICAgIHBhc3N3b3JkID0gY3VycmVudFBhc3N3b3JkOworICAgICAgICBpbml0Q29tcG9uZW50cygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpc2UgdGhlIGRpYWxvZydzIEdVSSBjb21wb25lbnRzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbml0Q29tcG9uZW50cygpCisgICAgeworICAgICAgICBnZXRDb250ZW50UGFuZSgpLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOworCisgICAgICAgIEpMYWJlbCBqbFNlcnZpY2VVUkwgPSBuZXcgSkxhYmVsKCJTZXJ2aWNlIFVSTCIpOworICAgICAgICBqbFNlcnZpY2VVUkwuc2V0Qm9yZGVyKG5ldyBFbXB0eUJvcmRlcigwLDUsMCwwKSk7CisgICAgICAgIEpMYWJlbCBqbFVzZXJuYW1lID0gbmV3IEpMYWJlbCgiVXNlcm5hbWUiKTsKKyAgICAgICAgamxVc2VybmFtZS5zZXRCb3JkZXIobmV3IEVtcHR5Qm9yZGVyKDAsNSwwLDApKTsKKyAgICAgICAgSkxhYmVsIGpsUGFzc3dvcmQgPSBuZXcgSkxhYmVsKCJQYXNzd29yZCIpOworICAgICAgICBqbFBhc3N3b3JkLnNldEJvcmRlcihuZXcgRW1wdHlCb3JkZXIoMCw1LDAsMCkpOworCisgICAgICAgIC8vUG9wdWxhdGUgdGhlIGZpZWxkcyB3aXRoIHZhbHVlcyBhbmQgZGlzYWJsZSB1c2VyIGlucHV0CisgICAgICAgIGp0ZlNlcnZpY2VVUkwgPSBuZXcgSlRleHRGaWVsZCgxNSk7CisgICAgICAgIGp0ZlNlcnZpY2VVUkwuc2V0VGV4dChzZXJ2aWNlVVJMKTsKKyAgICAgICAganRmU2VydmljZVVSTC5zZXRFZGl0YWJsZShmYWxzZSk7CisgICAgICAgIC8vanRmU2VydmljZVVSTC5zZXRCb3JkZXIobmV3IEVtcHR5Qm9yZGVyKDAsMCwwLDUpKTsKKyAgICAgICAgCisgICAgICAgIGp0ZlVzZXJuYW1lID0gbmV3IEpUZXh0RmllbGQoMTUpOworICAgICAgICBqdGZVc2VybmFtZS5zZXRUZXh0KHVzZXJuYW1lKTsKKyAgICAgICAganRmVXNlcm5hbWUuc2V0RWRpdGFibGUoZmFsc2UpOworICAgICAgIC8vIGp0ZlVzZXJuYW1lLnNldEJvcmRlcihuZXcgRW1wdHlCb3JkZXIoMCwwLDAsNSkpOworICAgICAgICAKKyAgICAgICAganRmUGFzc3dvcmQgPSBuZXcgSlRleHRGaWVsZCgxNSk7CisgICAgICAgIGp0ZlBhc3N3b3JkLnNldFRleHQocGFzc3dvcmQpOworICAgICAgICBqdGZQYXNzd29yZC5zZXRFZGl0YWJsZShmYWxzZSk7CisgICAgICAgIC8vanRmUGFzc3dvcmQuc2V0Qm9yZGVyKG5ldyBFbXB0eUJvcmRlcigwLDAsMCw1KSk7CisKKyAgICAgICAgSkJ1dHRvbiBqYk9LID0gbmV3IEpCdXR0b24oIk9LIik7CisgICAgICAgIGpiT0suYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljbG9zZURpYWxvZygpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgCisvLyAgICAgICAgSkJ1dHRvbiBqYlZpZXdQYXNzd29yZCA9IG5ldyBKQnV0dG9uKCJWaWV3IHBhc3N3b3JkIik7CisvLyAgICAgICAgamJWaWV3UGFzc3dvcmQuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkKKy8vICAgICAgICB7CisvLyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldnQpCisvLyAgICAgICAgICAgIHsKKy8vICAgICAgICAgICAgCXNob3dQYXNzd29yZCgpOworLy8gICAgICAgICAgICB9CisvLyAgICAgICAgfSk7CisgICAgICAgIAorICAgICAgICBKUGFuZWwganBQYXNzd29yZCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoNCwgMiwgNSwgNSkpOworICAgICAgICBqcFBhc3N3b3JkLmFkZChqbFNlcnZpY2VVUkwpOworICAgICAgICBqcFBhc3N3b3JkLmFkZChqdGZTZXJ2aWNlVVJMKTsKKyAgICAgICAganBQYXNzd29yZC5hZGQoamxVc2VybmFtZSk7CisgICAgICAgIGpwUGFzc3dvcmQuYWRkKGp0ZlVzZXJuYW1lKTsKKyAgICAgICAganBQYXNzd29yZC5hZGQoamxQYXNzd29yZCk7CisgICAgICAgIGpwUGFzc3dvcmQuYWRkKGp0ZlBhc3N3b3JkKTsKKyAgICAgICAganBQYXNzd29yZC5zZXRCb3JkZXIobmV3IENvbXBvdW5kQm9yZGVyKAorICAgICAgICAgICAgICAgIG5ldyBFbXB0eUJvcmRlcigxMCwgMTAsIDEwLCAxMCksIG5ldyBFdGNoZWRCb3JkZXIoKSkpOworICAgICAgICAKKyAgICAgICAgSlBhbmVsIGpwQnV0dG9ucyA9IG5ldyBKUGFuZWwobmV3IEZsb3dMYXlvdXQoRmxvd0xheW91dC5DRU5URVIpKTsKKyAgICAgICAganBCdXR0b25zLmFkZChqYk9LKTsKKyAgICAgICAvLyBqcEJ1dHRvbnMuYWRkKGpiVmlld1Bhc3N3b3JkKTsKKyAgICAgICAgCisgICAgICAgIGdldENvbnRlbnRQYW5lKCkuYWRkKGpwUGFzc3dvcmQsIEJvcmRlckxheW91dC5DRU5URVIpOworICAgICAgICBnZXRDb250ZW50UGFuZSgpLmFkZChqcEJ1dHRvbnMsIEJvcmRlckxheW91dC5TT1VUSCk7CisKKyAgICAgICAgYWRkV2luZG93TGlzdGVuZXIobmV3IFdpbmRvd0FkYXB0ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aW5kb3dDbG9zaW5nKFdpbmRvd0V2ZW50IGV2dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbG9zZURpYWxvZygpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBzZXRSZXNpemFibGUoZmFsc2UpOworCisgICAgICAgIGdldFJvb3RQYW5lKCkuc2V0RGVmYXVsdEJ1dHRvbihqYk9LKTsKKworICAgICAgICBwYWNrKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIGRpYWxvZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2xvc2VEaWFsb2coKQorICAgIHsKKyAgICAgICAgc2V0VmlzaWJsZShmYWxzZSk7CisgICAgICAgIGRpc3Bvc2UoKTsKKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9uZXQvc2YvdGF2ZXJuYS90Mi93b3JrYmVuY2gvdWkvY3JlZGVudGlhbG1hbmFnZXIvYWN0aW9uL0NyZWRlbnRpYWxNYW5hZ2VyQWN0aW9uLmphdmEgYi9zcmMvbWFpbi9qYXZhL25ldC9zZi90YXZlcm5hL3QyL3dvcmtiZW5jaC91aS9jcmVkZW50aWFsbWFuYWdlci9hY3Rpb24vQ3JlZGVudGlhbE1hbmFnZXJBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDFkNTEyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9uZXQvc2YvdGF2ZXJuYS90Mi93b3JrYmVuY2gvdWkvY3JlZGVudGlhbG1hbmFnZXIvYWN0aW9uL0NyZWRlbnRpYWxNYW5hZ2VyQWN0aW9uLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgVW5pdmVyc2l0eSBvZiBNYW5jaGVzdGVyICAgCisgKiAKKyAqICBNb2RpZmljYXRpb25zIHRvIHRoZSBpbml0aWFsIGNvZGUgYmFzZSBhcmUgY29weXJpZ2h0IG9mIHRoZWlyCisgKiAgcmVzcGVjdGl2ZSBhdXRob3JzLCBvciB0aGVpciBlbXBsb3llcnMgYXMgYXBwcm9wcmlhdGUuCisgKiAKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogICAgCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAgICAKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG5ldC5zZi50YXZlcm5hLnQyLndvcmtiZW5jaC51aS5jcmVkZW50aWFsbWFuYWdlci5hY3Rpb247CisKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKKworaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0QWN0aW9uOworaW1wb3J0IGphdmF4LnN3aW5nLkltYWdlSWNvbjsKKy8vaW1wb3J0IGphdmF4LnN3aW5nLlN3aW5nVXRpbGl0aWVzOworCitpbXBvcnQgbmV0LnNmLnRhdmVybmEudDIud29ya2JlbmNoLnVpLmNyZWRlbnRpYWxtYW5hZ2VyLkNyZWRlbnRpYWxNYW5hZ2VyVUk7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQorcHVibGljIGNsYXNzIENyZWRlbnRpYWxNYW5hZ2VyQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RBY3Rpb24geworCisJcHJpdmF0ZSBzdGF0aWMgSW1hZ2VJY29uIElDT04gPSBuZXcgSW1hZ2VJY29uKENyZWRlbnRpYWxNYW5hZ2VyQWN0aW9uLmNsYXNzLmdldFJlc291cmNlKCIvaW1hZ2VzL2NyZWRfbWFuYWdlcjE2eDE2LnBuZyIpKTsKKwkKKwlwdWJsaWMgQ3JlZGVudGlhbE1hbmFnZXJBY3Rpb24oKSB7CisJCXN1cGVyKCJDcmVkZW50aWFsIE1hbmFnZXIiLElDT04pOworCX0KKwkKKwlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgeworCQlDcmVkZW50aWFsTWFuYWdlclVJIGNtVUkgPSBDcmVkZW50aWFsTWFuYWdlclVJLmdldEluc3RhbmNlKCk7CisJCWNtVUkuc2V0VmlzaWJsZSh0cnVlKTsKKworLy8JCVJ1bm5hYmxlIGNyZWF0ZUFuZFNob3dDcmVkZW50aWFsTWFuYWdlclVJID0gbmV3IFJ1bm5hYmxlKCl7CisvLworLy8JCSAgIHB1YmxpYyB2b2lkIHJ1bigpCisvLwkJICAgCXsKKy8vCQkJICAgQ3JlZGVudGlhbE1hbmFnZXJVSSBjbVVJID0gbmV3IENyZWRlbnRpYWxNYW5hZ2VyVUkoKTsKKy8vICAgCQkJCWNtVUkuc2V0VmlzaWJsZSh0cnVlKTsKKy8vCQkgICAJfQorLy8JCX07CisvLwkJU3dpbmdVdGlsaXRpZXMuaW52b2tlTGF0ZXIoY3JlYXRlQW5kU2hvd0NyZWRlbnRpYWxNYW5hZ2VyVUkpOworCisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9uZXQvc2YvdGF2ZXJuYS90Mi93b3JrYmVuY2gvdWkvY3JlZGVudGlhbG1hbmFnZXIvbWVudS9DcmVkZW50aWFsTWFuYWdlck1lbnUuamF2YSBiL3NyYy9tYWluL2phdmEvbmV0L3NmL3RhdmVybmEvdDIvd29ya2JlbmNoL3VpL2NyZWRlbnRpYWxtYW5hZ2VyL21lbnUvQ3JlZGVudGlhbE1hbmFnZXJNZW51LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRhOTBhZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvbmV0L3NmL3RhdmVybmEvdDIvd29ya2JlbmNoL3VpL2NyZWRlbnRpYWxtYW5hZ2VyL21lbnUvQ3JlZGVudGlhbE1hbmFnZXJNZW51LmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgVW5pdmVyc2l0eSBvZiBNYW5jaGVzdGVyICAgCisgKiAKKyAqICBNb2RpZmljYXRpb25zIHRvIHRoZSBpbml0aWFsIGNvZGUgYmFzZSBhcmUgY29weXJpZ2h0IG9mIHRoZWlyCisgKiAgcmVzcGVjdGl2ZSBhdXRob3JzLCBvciB0aGVpciBlbXBsb3llcnMgYXMgYXBwcm9wcmlhdGUuCisgKiAKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogICAgCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAgICAKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG5ldC5zZi50YXZlcm5hLnQyLndvcmtiZW5jaC51aS5jcmVkZW50aWFsbWFuYWdlci5tZW51OworCitpbXBvcnQgamF2YS5uZXQuVVJJOworCitpbXBvcnQgamF2YXguc3dpbmcuQWN0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7CisKK2ltcG9ydCBuZXQuc2YudGF2ZXJuYS50Mi5zZWN1cml0eS5jcmVkZW50aWFsbWFuYWdlci5DTUV4Y2VwdGlvbjsKK2ltcG9ydCBuZXQuc2YudGF2ZXJuYS50Mi5zZWN1cml0eS5jcmVkZW50aWFsbWFuYWdlci5DcmVkZW50aWFsTWFuYWdlcjsKK2ltcG9ydCBuZXQuc2YudGF2ZXJuYS50Mi51aS5tZW51LkFic3RyYWN0TWVudUFjdGlvbjsKK2ltcG9ydCBuZXQuc2YudGF2ZXJuYS50Mi53b3JrYmVuY2gudWkuY3JlZGVudGlhbG1hbmFnZXIuYWN0aW9uLkNyZWRlbnRpYWxNYW5hZ2VyQWN0aW9uOworCitwdWJsaWMgY2xhc3MgQ3JlZGVudGlhbE1hbmFnZXJNZW51IGV4dGVuZHMgQWJzdHJhY3RNZW51QWN0aW9ueworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoQ3JlZGVudGlhbE1hbmFnZXJNZW51LmNsYXNzKTsKKwkKKwlwdWJsaWMgQ3JlZGVudGlhbE1hbmFnZXJNZW51KCkgeworCQlzdXBlcihVUkkuY3JlYXRlKCJodHRwOi8vdGF2ZXJuYS5zZi5uZXQvMjAwOC90MndvcmtiZW5jaC9tZW51I2FkdmFuY2VkIiksNjApOworCQkvLyBGb3JjZSBpbml0aWFsaXNhdGlvbiBhdCBzdGFydHVwCisJCQorCQl0cnkgeworCQkJQ3JlZGVudGlhbE1hbmFnZXIuaW5pdGlhbGlzZVNTTCgpOworCQl9IGNhdGNoIChDTUV4Y2VwdGlvbiBlKSB7CisJCQlsb2dnZXIuZXJyb3IoIkNvdWxkIG5vdCBpbml0aWFsaXNlIFNTTCIsIGUpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVBY3Rpb24oKSB7CisJCXJldHVybiBuZXcgQ3JlZGVudGlhbE1hbmFnZXJBY3Rpb24oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvbmV0L3NmL3RhdmVybmEvdDIvd29ya2JlbmNoL3VpL2NyZWRlbnRpYWxtYW5hZ2VyL3Rvb2xiYXIvQ3JlZGVudGlhbE1hbmFnZXJUb29sYmFyQWN0aW9uLmphdmEgYi9zcmMvbWFpbi9qYXZhL25ldC9zZi90YXZlcm5hL3QyL3dvcmtiZW5jaC91aS9jcmVkZW50aWFsbWFuYWdlci90b29sYmFyL0NyZWRlbnRpYWxNYW5hZ2VyVG9vbGJhckFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkOTczMzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL25ldC9zZi90YXZlcm5hL3QyL3dvcmtiZW5jaC91aS9jcmVkZW50aWFsbWFuYWdlci90b29sYmFyL0NyZWRlbnRpYWxNYW5hZ2VyVG9vbGJhckFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIFVuaXZlcnNpdHkgb2YgTWFuY2hlc3RlciAgIAorICogCisgKiAgTW9kaWZpY2F0aW9ucyB0byB0aGUgaW5pdGlhbCBjb2RlIGJhc2UgYXJlIGNvcHlyaWdodCBvZiB0aGVpcgorICogIHJlc3BlY3RpdmUgYXV0aG9ycywgb3IgdGhlaXIgZW1wbG95ZXJzIGFzIGFwcHJvcHJpYXRlLgorICogCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAgIAorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogICAgCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBuZXQuc2YudGF2ZXJuYS50Mi53b3JrYmVuY2gudWkuY3JlZGVudGlhbG1hbmFnZXIudG9vbGJhcjsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKKworaW1wb3J0IGphdmF4LnN3aW5nLkFjdGlvbjsKKworaW1wb3J0IG5ldC5zZi50YXZlcm5hLnQyLnVpLm1lbnUuQWJzdHJhY3RNZW51QWN0aW9uOworaW1wb3J0IG5ldC5zZi50YXZlcm5hLnQyLndvcmtiZW5jaC51aS5jcmVkZW50aWFsbWFuYWdlci5hY3Rpb24uQ3JlZGVudGlhbE1hbmFnZXJBY3Rpb247CisKK3B1YmxpYyBjbGFzcyBDcmVkZW50aWFsTWFuYWdlclRvb2xiYXJBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdE1lbnVBY3Rpb257CisKKwlwdWJsaWMgQ3JlZGVudGlhbE1hbmFnZXJUb29sYmFyQWN0aW9uKCkgeworCQlzdXBlcihDcmVkZW50aWFsTWFuYWdlclRvb2xiYXJTZWN0aW9uLkNSRURFTlRJQUxfTUFOQUdFUl9UT09MQkFSX1NFQ1RJT04sMTAwLFVSSS5jcmVhdGUoImh0dHA6Ly90YXZlcm5hLnNmLm5ldC8yMDA4L3Qyd29ya2JlbmNoL3Rvb2xiYXIjY3JlZGVudGlhbE1hbmFnZXJBY3Rpb24iKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVBY3Rpb24oKSB7CisJCXJldHVybiBuZXcgQ3JlZGVudGlhbE1hbmFnZXJBY3Rpb24oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvbmV0L3NmL3RhdmVybmEvdDIvd29ya2JlbmNoL3VpL2NyZWRlbnRpYWxtYW5hZ2VyL3Rvb2xiYXIvQ3JlZGVudGlhbE1hbmFnZXJUb29sYmFyU2VjdGlvbi5qYXZhIGIvc3JjL21haW4vamF2YS9uZXQvc2YvdGF2ZXJuYS90Mi93b3JrYmVuY2gvdWkvY3JlZGVudGlhbG1hbmFnZXIvdG9vbGJhci9DcmVkZW50aWFsTWFuYWdlclRvb2xiYXJTZWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIxMjA0ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvbmV0L3NmL3RhdmVybmEvdDIvd29ya2JlbmNoL3VpL2NyZWRlbnRpYWxtYW5hZ2VyL3Rvb2xiYXIvQ3JlZGVudGlhbE1hbmFnZXJUb29sYmFyU2VjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIFVuaXZlcnNpdHkgb2YgTWFuY2hlc3RlciAgIAorICogCisgKiAgTW9kaWZpY2F0aW9ucyB0byB0aGUgaW5pdGlhbCBjb2RlIGJhc2UgYXJlIGNvcHlyaWdodCBvZiB0aGVpcgorICogIHJlc3BlY3RpdmUgYXV0aG9ycywgb3IgdGhlaXIgZW1wbG95ZXJzIGFzIGFwcHJvcHJpYXRlLgorICogCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAgIAorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogICAgCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBuZXQuc2YudGF2ZXJuYS50Mi53b3JrYmVuY2gudWkuY3JlZGVudGlhbG1hbmFnZXIudG9vbGJhcjsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKKworaW1wb3J0IG5ldC5zZi50YXZlcm5hLnQyLnVpLm1lbnUuQWJzdHJhY3RNZW51U2VjdGlvbjsKK2ltcG9ydCBuZXQuc2YudGF2ZXJuYS50Mi51aS5tZW51LkRlZmF1bHRUb29sQmFyOworCitwdWJsaWMgY2xhc3MgQ3JlZGVudGlhbE1hbmFnZXJUb29sYmFyU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0TWVudVNlY3Rpb24geworCisJcHVibGljIHN0YXRpYyBVUkkgQ1JFREVOVElBTF9NQU5BR0VSX1RPT0xCQVJfU0VDVElPTiA9IFVSSS5jcmVhdGUoImh0dHA6Ly90YXZlcm5hLnNmLm5ldC8yMDA4L3Qyd29ya2JlbmNoL3Rvb2xiYXIjY3JlZGVudGlhbE1hbmFnZXJTZWN0aW9uIik7CisJCisJcHVibGljIENyZWRlbnRpYWxNYW5hZ2VyVG9vbGJhclNlY3Rpb24oKSB7CisJCXN1cGVyKERlZmF1bHRUb29sQmFyLkRFRkFVTFRfVE9PTF9CQVIsIDEwMCwgQ1JFREVOVElBTF9NQU5BR0VSX1RPT0xCQVJfU0VDVElPTik7CisJfQorCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvbmV0LnNmLnRhdmVybmEudDIudWkubWVudS5NZW51Q29tcG9uZW50IGIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL25ldC5zZi50YXZlcm5hLnQyLnVpLm1lbnUuTWVudUNvbXBvbmVudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzQzYzJmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL25ldC5zZi50YXZlcm5hLnQyLnVpLm1lbnUuTWVudUNvbXBvbmVudApAQCAtMCwwICsxLDMgQEAKK25ldC5zZi50YXZlcm5hLnQyLndvcmtiZW5jaC51aS5jcmVkZW50aWFsbWFuYWdlci5tZW51LkNyZWRlbnRpYWxNYW5hZ2VyTWVudQorI25ldC5zZi50YXZlcm5hLnQyLndvcmtiZW5jaC51aS5jcmVkZW50aWFsbWFuYWdlci50b29sYmFyLkNyZWRlbnRpYWxNYW5hZ2VyVG9vbGJhckFjdGlvbgorI25ldC5zZi50YXZlcm5hLnQyLndvcmtiZW5jaC51aS5jcmVkZW50aWFsbWFuYWdlci50b29sYmFyLkNyZWRlbnRpYWxNYW5hZ2VyVG9vbGJhclNlY3Rpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL2NyZWRfbWFuYWdlci5wbmcgYi9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL2NyZWRfbWFuYWdlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhjZDYzYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvY3JlZF9tYW5hZ2VyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL2NyZWRfbWFuYWdlcjE2eDE2LnBuZyBiL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvY3JlZF9tYW5hZ2VyMTZ4MTYucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZTczYjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL2NyZWRfbWFuYWdlcjE2eDE2LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL2NyZWRfbWFuYWdlcl90cmFuc3BhcmVudC5wbmcgYi9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL2NyZWRfbWFuYWdlcl90cmFuc3BhcmVudC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU4OWJkZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvY3JlZF9tYW5hZ2VyX3RyYW5zcGFyZW50LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL3RhYmxlL2VudHJ5X2hlYWRpbmcucG5nIGIvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy90YWJsZS9lbnRyeV9oZWFkaW5nLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjU5ODQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy90YWJsZS9lbnRyeV9oZWFkaW5nLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL3RhYmxlL2tleV9lbnRyeS5wbmcgYi9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL3RhYmxlL2tleV9lbnRyeS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZkMThjNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvdGFibGUva2V5X2VudHJ5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL3RhYmxlL2tleXBhaXJfZW50cnkucG5nIGIvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy90YWJsZS9rZXlwYWlyX2VudHJ5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmQzZThiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy90YWJsZS9rZXlwYWlyX2VudHJ5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL3RhYmxlL3RydXN0Y2VydF9lbnRyeS5wbmcgYi9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL3RhYmxlL3RydXN0Y2VydF9lbnRyeS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYxMTBlMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvdGFibGUvdHJ1c3RjZXJ0X2VudHJ5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCg==